P.UNS.MEM.01 要注意选择合适的结构体、元组、枚举的数据布局
【描述】
对于 Rust 中结构体和元组,编译器会随意重排其字段来优化布局。请根据具体的场景来选择合适的数据布局。
可以通过以下 #[repr] 属性来控制结构体和元组的数据布局:
#[repr(Rust)],默认 Rust 数据布局#[repr(C)],与 C 兼容的布局#[repr(align(N))],指定对齐方式#[repr(packed)],指定字段将不在内部对齐#[repr(transparent)],让包含单个字段的结构体布局和其字段相同
可以通过以下 #[repr] 属性来控制枚举体的数据布局:
- 特定整数类型
#[repr(u8)]#[repr(u16)]#[repr(u32)]#[repr(u64)]#[repr(i8)]#[repr(i16)]#[repr(i32)]#[repr(i64)]
- C 兼容布局
#[repr(C)]
- 指定判别式大小的 C 兼容布局
#[repr(C, u8)]#[repr(C, u16)]- 以此类推
枚举需要注意的地方:
- 枚举不允许通过
#[repr(align)]手动指定对齐方式。 - 空枚举不能使用
repr属性 - 无字段枚举不允许指定判别式大小的 C 兼容布局,比如
[repr(C, Int)] - 数据承载(有字段)枚举则允许所有类型的
repr属性