MST

星途 面试题库

面试题:C++ 内存访问机制之中等难度题

在C++中,结构体的内存对齐规则是怎样的?请举例说明如何计算一个结构体的实际占用内存大小。
22.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 内存对齐规则
    • 基础类型对齐:基础数据类型(如charintdouble等)有其自身的对齐要求。一般来说,char的对齐字节数为1,int通常为4(在32位系统下)或8(在64位系统下),double通常为8。
    • 结构体成员对齐:结构体的成员按照声明顺序依次存储,每个成员的偏移量(相对于结构体起始地址)必须是该成员自身对齐字节数的整数倍。如果某个成员之前的空间不足以满足对齐要求,编译器会在成员之间填充一些字节,以保证对齐。
    • 结构体整体对齐:结构体的总大小必须是其最大对齐成员的对齐字节数的整数倍。如果不足,编译器会在结构体末尾填充字节。
  2. 计算示例
#include <iostream>

struct MyStruct {
    char a; // 1字节,对齐字节数为1
    int b;  // 4字节,对齐字节数为4
    short c; // 2字节,对齐字节数为2
};

int main() {
    std::cout << "MyStruct size: " << sizeof(MyStruct) << std::endl;
    return 0;
}
  • 对于MyStruct
    • a占用1字节,偏移量为0,满足对齐要求。
    • b的对齐字节数为4,a之后的偏移量为1,不满足b的对齐要求,所以在a后填充3字节,使b的偏移量为4,b占用4字节。
    • c的对齐字节数为2,b之后偏移量为8,满足对齐要求,c占用2字节。
    • 此时结构体总大小为1 + 3 + 4 + 2 = 10字节,但结构体整体对齐要求是最大对齐成员(这里是b,对齐字节数为4)的整数倍,所以末尾再填充2字节,最终MyStruct的实际占用内存大小为12字节。运行上述代码,sizeof(MyStruct)的输出结果为12。