MST

星途 面试题库

面试题:Rust原生类型内存对齐与布局

假设你有一个结构体包含i8、u32和f32三个字段,按照Rust的内存布局规则,这个结构体的总大小是多少?为什么?如何通过调整字段顺序来优化内存布局?
23.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 结构体总大小
    • 在Rust中,i8 类型占1字节,u32 类型占4字节,f32 类型占4字节。
    • 由于内存对齐的原因,结构体的总大小至少为 (1 + 3) + 4 + 4 = 12 字节。i8 之后会填充3字节以满足 u32 的4字节对齐要求(u32 要求4字节对齐),然后 u32f32 各自4字节。所以该结构体总大小为12字节。
  2. 原因
    • Rust遵循内存对齐规则,不同类型有不同的对齐要求。u32f32 都要求4字节对齐,i8 本身只占1字节,但为了后续 u32 能正确对齐,会在 i8 后填充3字节。
  3. 优化内存布局
    • 可以将字段顺序调整为 u32f32i8。这样,u32f32 相邻存储,共占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,
}