Rust中内存对齐基本规则
- 基本类型对齐:
- 对于基本数据类型(如
u8
、i8
),它们的对齐要求等于自身的大小。例如,u8
的大小是1字节,其对齐要求也是1字节。
- 对于像
u32
这样4字节大小的类型,其对齐要求是4字节;u64
大小为8字节,对齐要求是8字节。
- 结构体对齐:
- 结构体的对齐要求是其所有字段中最大对齐要求的倍数。
- 结构体实例的起始地址必须是结构体对齐要求的倍数。
- 每个字段在结构体中的偏移量必须是该字段对齐要求的倍数。
结构体内存对齐计算示例
// 示例1
struct S1 {
a: u8,
b: u32,
}
// 示例2
struct S2 {
a: u32,
b: u8,
}
S1
结构体内存对齐计算:
u8
类型的a
字段大小为1字节,对齐要求为1字节。
u32
类型的b
字段大小为4字节,对齐要求为4字节。
S1
结构体的对齐要求是其字段中最大对齐要求,即4字节。
a
字段偏移量为0,满足其对齐要求(0是1的倍数)。
b
字段对齐要求是4字节,所以在a
字段后需要填充3个字节,使b
字段的偏移量为4(4是4的倍数)。
S1
结构体的大小为1 + 3 + 4 = 8
字节。
S2
结构体内存对齐计算:
u32
类型的a
字段大小为4字节,对齐要求为4字节,偏移量为0(满足对齐要求)。
u8
类型的b
字段大小为1字节,对齐要求为1字节,偏移量为4(4是1的倍数)。
S2
结构体的对齐要求是4字节(a
字段的对齐要求)。
S2
结构体大小为4 + 1 = 5
字节,由于结构体大小必须是其对齐要求的倍数,所以需要填充3个字节,最终S2
结构体大小为4 + 1 + 3 = 8
字节。