面试题答案
一键面试// 自定义类型 MyType1
struct MyType1 {
data: [u8; 3]
}
// 自定义类型 MyType2
struct MyType2 {
value: f64
}
// 目标结构体,为了紧凑布局,将占用字节少的 MyType1 放在前面
#[repr(C, packed)]
struct CompactStruct {
my_type1: MyType1,
my_type2: MyType2,
}
解释如何控制内存对齐以达到紧凑布局的目的
repr(C)
: 这个属性指定结构体使用 C 语言的内存布局规则,保证 Rust 结构体的内存布局与 C 语言结构体相同,使得不同语言间的交互更容易。同时,C 语言的布局规则相对较为熟知和稳定,是我们控制布局的基础。packed
: 这个属性告诉编译器尽可能紧凑地排列结构体成员,不进行额外的填充以满足对齐要求。通常,结构体成员会根据其类型的对齐要求进行对齐,例如f64
类型通常需要 8 字节对齐。但使用packed
后,编译器会紧密排列成员,减少填充字节,从而达到紧凑布局的目的。不过,使用packed
可能会导致访问未对齐内存,在某些硬件平台上会引发性能问题甚至错误,所以要谨慎使用。
在定义 CompactStruct
时,将 MyType1
放在前面,因为它占用的字节数少(3 字节),这样可以减少可能出现的填充字节,使得整个结构体在堆内存中的布局更加紧凑。