MST

星途 面试题库

面试题:Rust堆内存内存对齐:自定义类型的对齐控制

定义一个包含多个自定义类型成员的结构体,其中自定义类型 `MyType1` 和 `MyType2` 分别如下: ```rust struct MyType1 { data: [u8; 3] } struct MyType2 { value: f64 } ``` 要求结构体在堆内存中的布局尽量紧凑,同时满足内存对齐要求。请写出这个结构体的定义,并解释如何控制内存对齐以达到紧凑布局的目的。
20.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 自定义类型 MyType1
struct MyType1 {
    data: [u8; 3]
}
// 自定义类型 MyType2
struct MyType2 {
    value: f64
}

// 目标结构体,为了紧凑布局,将占用字节少的 MyType1 放在前面
#[repr(C, packed)]
struct CompactStruct {
    my_type1: MyType1,
    my_type2: MyType2,
}

解释如何控制内存对齐以达到紧凑布局的目的

  1. repr(C): 这个属性指定结构体使用 C 语言的内存布局规则,保证 Rust 结构体的内存布局与 C 语言结构体相同,使得不同语言间的交互更容易。同时,C 语言的布局规则相对较为熟知和稳定,是我们控制布局的基础。
  2. packed: 这个属性告诉编译器尽可能紧凑地排列结构体成员,不进行额外的填充以满足对齐要求。通常,结构体成员会根据其类型的对齐要求进行对齐,例如 f64 类型通常需要 8 字节对齐。但使用 packed 后,编译器会紧密排列成员,减少填充字节,从而达到紧凑布局的目的。不过,使用 packed 可能会导致访问未对齐内存,在某些硬件平台上会引发性能问题甚至错误,所以要谨慎使用。

在定义 CompactStruct 时,将 MyType1 放在前面,因为它占用的字节数少(3 字节),这样可以减少可能出现的填充字节,使得整个结构体在堆内存中的布局更加紧凑。