MST

星途 面试题库

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

请阐述C++中结构体的内存对齐规则,并给出一个结构体示例,计算其实际占用内存大小,并解释计算过程。
29.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

内存对齐规则

  1. 第一个成员:结构体的第一个成员在结构体变量偏移量为0的地址处。
  2. 其他成员:其他成员要对齐到某个对齐数的整数倍的地址处。对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。在Visual Studio中,默认对齐数为8,在GCC中,默认对齐数为4。
  3. 结构体总体:结构体的总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  4. 嵌套结构体:如果结构体A里嵌套结构体B,B里的第一个成员的对齐规则与A一样,结构体B作为A的成员,其对齐规则是其内部最大对齐数的整数倍,结构体A的总大小也是最大对齐数的整数倍(包括B的最大对齐数)。

示例

struct Test {
    char a;
    int b;
    short c;
};

计算实际占用内存大小及过程

  1. 成员achar类型大小为1字节,对齐数为1(char大小1与默认对齐数8或4的较小值),所以a从偏移量0开始,占用1字节。
  2. 成员bint类型大小为4字节,对齐数为4(int大小4与默认对齐数8或4的较小值)。由于前一个成员a占用1字节,下一个地址偏移量为1,不是4的整数倍,需要填充3字节,使得b从偏移量4开始,占用4字节。此时已占用8字节。
  3. 成员cshort类型大小为2字节,对齐数为2(short大小2与默认对齐数8或4的较小值)。当前偏移量为8,是2的整数倍,c从偏移量8开始,占用2字节。此时总占用10字节。
  4. 结构体总体:最大对齐数为4(int的对齐数),10不是4的整数倍,需要填充2字节,所以结构体Test实际占用内存大小为12字节。