1. 第一个成员在与结构体变量偏移量为 0 的地址处。2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的 较小值 。VS 中默认的值为 83. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
struct S1
{
char c1;
int i;
char c2;
};
拿上图结构体举例,我们可以画图表示
第一个成员在与结构体变量偏移量为0的地址处。
可以画一个内存,标号从0开始。
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
例如结构体S1中的char c1,char类型占1个字节,所以占用标号为0的地址处。
再来看第二个成员int,整型占4个字节,而且要对其到对齐数的整数倍的地址处 。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
在vs环境下 默认对齐数为8,而整型为4,所以要对齐到4的倍数地址处,即:
再看第三个成员,又是char类型,而下一地址处的标号为8,就是1的倍数,所以char c2就占标号为8的地址处。
当所有成员占完后, 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
该结构体的最大对齐数为4,当前结构体占了9个字节,不是4的倍数,所以继续往下占用内存空间,直到总大小是4的倍数。
到此为止,该结构体的总大小就知道了,是12。
struct S2
{
char c1;
char c2;
int i;
};
根据上述方法,可知该结构体的大小为8。
故得出结论,结构体的大小还和成员顺序有关。
struct S3
{
char c1;
struct S2 s2;
double d;
};
当遇到结构体里嵌套结构体时
如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
意思就是说,结构体成员里有结构体时,嵌套的结构体的对齐数是该结构体成员里最大的对齐数。struct s2的大小为8,struct s2的成员里,最大对齐数是整型,即4。
所以计算struct s3时,方法不变,依然先是画出一块内存,标号从0开始,其次开始对齐各成员,故如图所示
目前该结构体共占24个字节,最大对齐数是8,24是8的倍数,故该结构体的大小为24。
以上就是如何计算结构体大小的方法,如有不足之处请各位大佬批评指正,欢迎交流!!