Rust 编译器中一个令人惊讶的枚举大小优化 · James Fennell 的帖子

主要观点:Rust 中的枚举(enum)是一种流行的特性,其值是指定变体集合中的一个。Rust 编译器对枚举值的内存表示进行了优化,以减小内存使用。一般来说,枚举的大小是最大有效负载的大小加上存储变体标签的额外字节。

关键信息

  • 示例枚举 Fooenum 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 中。
阅读 46
0 条评论