Rust 内存布局 「1」

566 阅读1分钟

Rust中对复合类型的内存排布有一整套机制:

  • Arrays
  • Enums
  • Structs
  • Tuples

上述结构在内存的布局方式,取决于所选择的表示方式。默认情况下,Rust中的所有东西都是 repr(Rust)。所有 repr(Rust) 类型都以2对齐的 → (1, 2, 4, 8...)以此类推。基础类型:u8, usize, bool 以及 &T 都是按照其大小对其。在Rust中,结构体内存布局是按照其最大位宽字段对齐的(俗称:内存对齐)。比如下面这个 struct:

struct AGC {
  elapsed_time2: u16,
  elapsed_time1: u16,
  wait_list_upper: u32,
  wait_list_lower: u16,
  digital_autopilot: u16,
  fine_scale: u16
}

struct AGC 会匹配u32(32位)。Rust会对字段进行重排序,从而达到最大的组装效果。而 enum 则不一样,它可以通过一系列优化,最明显的就是空指针优化。例如下面:

enum AGCInstruction {
  TC,
  TCF,
  CCS(u8),
  B(u16),
  BZF,
}

实际上会被优化成:

struct AGCInstructionRepr {
  data: u16,
  tag: u8,
}

data field 的位宽足以容纳最大的内部值,而 tag 则来允许区分不同的变量字段。

如果一个枚举持有一个不可为空的指针,而其他变量不能引用相同的指针,这时情况就会变得复杂。Option<&T> 意味着如果在解引用该选项时发现了一个空指针,Rust可以认为发现了None变量。Rust会优化掉 Option<&T>


TODO!!!

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情