主要观点:Rust 中的枚举(enum)是一种流行的特性,其值是指定变体集合中的一个。Rust 编译器对枚举值的内存表示进行了优化,以减小内存使用。一般来说,枚举的大小是最大有效负载的大小加上存储变体标签的额外字节。
关键信息:
- 示例枚举
Foo
:enum Foo { Int(u32), Char(char) }
,其值要么是整数(如Foo::Int(3)
),要么是字符(如Foo::Char('A')
),整体大小为 8 字节。 - 打印任意 Rust 值内存表示的函数
print_memory_representation
。 - 枚举大小优化的“小众优化”:对于只有一个变体有有效负载的类型,如
Option<char>
,编译器会选择一个无效的位模式作为“小众”,不使用标签来表示Some
变体,用“小众”表示None
变体。 - 嵌套枚举的优化:对于包含
Inner
枚举作为有效负载的Outer
枚举,其值的大小为 8 字节,而不是预期的 12 字节,编译器通过巧妙利用Inner
枚举的标签和有效负载结构来实现。
重要细节:
- 计算机内存是小端序,低字节在前,如 32 位十六进制数 5 的小端序表示为
05 00 00 00
。 Option<char>
中None
的内存表示为00 00 11 00
,恰好比最大有效 Unicode 码点大 1。Outer
枚举中,Outer::C
的标签为 2,Outer::D
的表示与Inner
相同,当Outer
的标签与Inner
的标签匹配时为Outer::D
且有效负载为整个位模式,否则为其他变体且有效负载在Outer remainder
中。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。