You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:46:05