山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
我们已经掌握了结构体的基本使用了。现在我们深入讨论一个问题:计算结构体的大小。
这也是一个特别热门的考点:结构体内存对齐
示例:
第一个s如果根据字符长度打印的话应该是打印5
但是它最后的结果应该是8
第二个s根据字符长度打印应该是打印6
但是它的结果是12
这就是结构体内存对齐问题
示例2:
它的结果是12
它为什么是12呢
如果按照普通的理解的话char占一个字节
int占4个字节 char占1个字节结果应该是6个字节
因为结构体的内存对齐所以它是12
结构体内存对齐规则:
1 .第一个成员在与结构体变量偏移量为0的地址处。
2 .其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数=编译器默认的一个对齐数与该成员大小的较小值。
VS中默认的值为8
3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
注意:
1.结构体的第一个成员
放在结构体变量在内存中存储位置的0偏移处开始
2.从第二个成员往后的所有成员。都放在一个对齐数(成员的大小和默认对齐数的较小值)的整数的整数倍的地址处
3.结构体总大小是结构体的所有成员的对齐数中最大的那个对齐数的整数倍