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