C++中字节的对齐方式可以采用编译器默认的字节对齐方式, 也可以采用自定义的对齐方式。
编译器默认字节对齐方式
例1:
struct test1
{
char c1; //c1长度1个字节, 采用1字节对齐
short s; // s长度为2个字节,采用2字节对齐
int i; // i长度为4个字节,采用4字节对齐
char c2; //c2长度1个字节,采用1字节对齐
};
sizeof(test1)的结果为12。
test1 的内存分布如下(以1表示占用字节,*表示空字节)
c1 | s | i | c2 |
1* | 11 | 1111 | 1*** |
原因如下:
- 成员c1,其偏移地址为0,占据了第1个字节。此时共分配了1个字节。
- 成员s为short类型,占用2个字节,采用2字节对齐。已经分配的1个字节不是2的整数倍,所以编译器在c1与s之间插入1个空字节,然后为s分配2个字节。此时共分配了4个字节。
- 成员i为int类型,占用4个字节,采用4字节对齐。已经分配的4个字节是4的整数倍,所以编译器在i与s之间不插入空字节,然后直接为i分配4个字节。此时共分配了8个字节。
- 成员c2为char类型,占用1个字节,采用1字节对齐。已经分配的8个字节是1的整数倍,所以编译器在c2与i之间不插入空字节,然后直接为c2分配1个字节。此时共分配了9个字节。
- 此时所有的成员已经分配完了,但test1是采用4字节对齐的(请查看第2点),9不是4的整数倍(请查看第3点),故在c2之后插件3个空字节以使test1对齐。此时共分配了12个字节,所以Sizeof(test)的结果为12。
例2: