- 结构体总大小:
- 在Rust中,
i8
类型占1字节,u32
类型占4字节,f32
类型占4字节。
- 由于内存对齐的原因,结构体的总大小至少为
(1 + 3) + 4 + 4 = 12
字节。i8
之后会填充3字节以满足 u32
的4字节对齐要求(u32
要求4字节对齐),然后 u32
和 f32
各自4字节。所以该结构体总大小为12字节。
- 原因:
- Rust遵循内存对齐规则,不同类型有不同的对齐要求。
u32
和 f32
都要求4字节对齐,i8
本身只占1字节,但为了后续 u32
能正确对齐,会在 i8
后填充3字节。
- 优化内存布局:
- 可以将字段顺序调整为
u32
、f32
、i8
。这样,u32
和 f32
相邻存储,共占8字节,i8
单独占1字节,结构体总大小变为 4 + 4 + 1 = 9
字节,由于内存对齐,最终大小为 (4 + 4 + 1) + 3 = 12
字节(i8
后填充3字节以满足整体4字节对齐要求)。但如果在后续使用中没有其他结构体与之组合等情况,这样的顺序可以在一定程度上优化内存布局,减少内存空洞。
// 原始结构体
struct Original {
a: i8,
b: u32,
c: f32,
}
// 优化内存布局后的结构体
struct Optimized {
b: u32,
c: f32,
a: i8,
}