计算规则
首先需要介绍<b>有效对齐值</b>:每个平台上的编译器都有默认对齐系数n,可以通过#pragma pack(n)来指定。有效对齐值就等与该对齐系数和结构体中最长的数据类型的长度两者最小的那一个值,比如对齐系数是8,而结构体中最长的是int,4个字节,那么有效对齐值为4。
结构体的内存计算方式遵循以下规则:
1.数据成员对齐规则:第一个数据成员放在offset为0的地方,以后的每一个成员的offset都必须是该成员的大小与有效对齐值相比较小的数值的整数倍,例子1中第一个数据成员是int 型,第二个是double,有效对齐值为8,所以double的起始地址应该为8,所以第一个int加上内存补齐用了8个字节
2.结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部有效对齐值的整数倍地址开始存储。(比如struct a中存有struct b,b里有char, int, double,那b应该从8的整数倍开始存储)
3.收尾工作:结构体的总大小,必须是其有效对齐值的整数倍,不足的要补齐。
#include <stdio.h>
int main()
{
typedef struct a
{
int c;
double d;
char b[10];
}test;
test e;
printf("%d", sizeof(test));
return 0;
}
输出的结果为:32
#include <stdio.h>
int main()
{
typedef struct a
{
double d;
int c;
char b[10];
}test;
test e;
printf("%d", sizeof(test));
return 0;
}
输出的结果为:24