Rust中#[repr(C)]修饰的零大小类型表现如何?
关于Rust中#[repr(C)]零大小结构体的疑问解答
Rust是否允许#[repr(C)]修饰零大小结构体?
允许。虽然C标准禁止零大小结构体(会触发未定义行为),但Rust的#[repr(C)]标记并非完全严格复刻C的所有规则,而是在FFI交互场景下对齐C的内存布局与调用约定,同时保留Rust自身的特性。零大小结构体(ZST)是Rust的原生支持特性,即使用#[repr(C)]修饰,Rust仍然允许定义这类结构体。
这类结构体的实际大小真的是0吗?
是的。std::mem::size_of::<ZeroSized>()返回0是准确的,#[repr(C)]不会改变ZST的零大小特性。C中不存在零大小类型,所以Rust在这里不需要兼容C的相关限制——因为没有对应的C类型可以映射,Rust只需要保证自身对ZST的处理是安全的即可。
复制它时内存会有什么变化?
复制零大小结构体不会产生任何内存操作。因为这类结构体没有实际的数据字段,复制操作本质上是空操作,既不需要读取内存,也不需要写入内存,完全没有性能开销。
能否获取它的指针?
可以获取,但这类指针是特殊的“幽灵指针”:
- 你可以通过
&ZeroSized或std::ptr::null::<ZeroSized>()等方式获取指针; - 解引用这类指针是安全的,因为没有实际内存需要访问,不会触发非法内存访问;
- 需要注意的是,当将这类指针传递给C代码时,由于C中没有对应类型,必须根据具体场景做适配(比如转为
void*空指针),避免触发C端的未定义行为。
内容的提问来源于stack exchange,提问作者LucioleMaléfique
相关产品推荐
相关产品推荐

