主要观点: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) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。