MST

星途 面试题库

面试题:Rust内存对齐的基本规则

请阐述Rust中内存对齐的基本规则,并举例说明结构体的内存对齐是如何计算的。
34.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Rust中内存对齐基本规则

  1. 基本类型对齐
    • 对于基本数据类型(如u8i8),它们的对齐要求等于自身的大小。例如,u8的大小是1字节,其对齐要求也是1字节。
    • 对于像u32这样4字节大小的类型,其对齐要求是4字节;u64大小为8字节,对齐要求是8字节。
  2. 结构体对齐
    • 结构体的对齐要求是其所有字段中最大对齐要求的倍数。
    • 结构体实例的起始地址必须是结构体对齐要求的倍数。
    • 每个字段在结构体中的偏移量必须是该字段对齐要求的倍数。

结构体内存对齐计算示例

// 示例1
struct S1 {
    a: u8,
    b: u32,
}

// 示例2
struct S2 {
    a: u32,
    b: u8,
}
  1. 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字节。
  2. 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字节。