Option<&T> 为什么没有额外开销?在 FFI 里它又怎么变成 C 的可空指针?这篇不靠文档,而是直接读 None 的位模式,并真的调用 libc 的 getenv、strchr、free 来验证。
编译:成功
运行(退出码 0):
None 的位模式:&u32 0x0 &mut u32 0x0 Box<u32> 0x0 NonNull<u32> 0x0 fn() 0x0 extern "C" fn() 0x0
大小:8 8 8 8 8 8(都是一个指针)
对照:*const u32 8 字节,Option<*const u32> 16 字节(裸指针可以为空,没有 niche)通用的 niche 规则见Enum 的内存布局。
编译:成功
运行(退出码 0):
getenv("HOME") → Some(C 返回了非空指针)
getenv("U117_NOT_SET") → None(C 返回了 NULL)
strchr("hello world", 'w') → Some("world") strchr(.., 'z') → NoneFFI 调用的基础见FFI 调用 C 函数。
编译:成功
运行(退出码 0):
free(None) 没有崩溃(传给 C 的是 NULL)
malloc(16) → Some(非空指针) 编译:成功
运行(退出码 0):
Option<Box<Node>> 的链表节点:16 字节;Option<NonNull<Node>>:16 字节;裸指针 + bool 标志:24 字节
Option<u64> 做可选索引:24 字节;Option<NonZeroU64>:16 字节