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天,点击查看活动详情。