MST

星途 面试题库

面试题:C++ 中结构体数据在内存中的对齐规则及示例

请简述C++中结构体数据在内存中的对齐规则,并通过一段代码示例说明不同成员顺序对结构体大小的影响。
12.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

C++ 中结构体数据内存对齐规则

  1. 对齐系数:每个数据类型都有自己的对齐系数,例如 char 通常为 1,short 通常为 2,intfloat 通常为 4,double 通常为 8 等。不同编译器可能会有细微差别。
  2. 结构体成员对齐:结构体成员存储时,其偏移量必须是其对齐系数的整数倍。如果不是,则在成员之间填充字节以满足对齐要求。
  3. 结构体整体对齐:结构体的大小必须是其最大对齐系数成员的对齐系数的整数倍。如果不是,则在结构体末尾填充字节。

代码示例说明不同成员顺序对结构体大小的影响

#include <iostream>

// 定义结构体1
struct Struct1 {
    char a;
    int b;
    short c;
};

// 定义结构体2,成员顺序不同
struct Struct2 {
    int b;
    char a;
    short c;
};

int main() {
    std::cout << "Struct1 size: " << sizeof(Struct1) << std::endl;
    std::cout << "Struct2 size: " << sizeof(Struct2) << std::endl;
    return 0;
}

在上述代码中:

  • Struct1char a 占 1 字节,int b 对齐系数为 4,a 之后需填充 3 字节使 b 的偏移量为 4 的倍数,b 占 4 字节,short c 对齐系数为 2,b 之后无需填充,c 占 2 字节,最后结构体整体大小需为最大对齐系数(这里是 4)的整数倍,所以再填充 2 字节,Struct1 大小为 12 字节。
  • Struct2int b 占 4 字节,char a 对齐系数为 1,无需填充,占 1 字节,short c 对齐系数为 2,a 之后填充 1 字节使 c 的偏移量为 2 的倍数,c 占 2 字节,结构体整体大小已是最大对齐系数(4)的整数倍,Struct2 大小为 8 字节。这就体现了不同成员顺序对结构体大小的影响。