#include
struct A
{
double l;
int i;
int b;
char c;
};
int main()
{
struct A m[2];
printf("%d\n", sizeof(struct A));
printf("%p\n", &m[0]);
printf("%p\n", &m[1]);
printf("%d\n", (int)&m[1]-(int)&m[0]);
printf("%p\n", &(m[0].l));
printf("%p\n", &(m[1].l));
return 0;
}
对于上面的代码, 在VC中,结构体A的大小为24, 但是在gcc 中其大小却为20, 这样, 我连续分配两个这个结构体时, 第二个结构体的起始就不是double大小的倍数
#include
struct A
{
double l;
int i;
int b;
char c;
};
int main()
{
struct A m[2];
printf("%d\n", sizeof(struct A));
pri ...
每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。在lz的程序中,n默认是4。
在这个前提下分析lz得到的结果:
4字节对齐(#pragma pack(4))
sizeof(m[0]) = 20;
分析过程:
1)成员数据对齐
struct A {
double l; /* 长度8 > 4 按4对齐;起始offset=0 0%4=0;存放位置区间[0,7] */
int i; /* 长度4 = 4 按4对齐;起始offset=8 8%4=0;存放位置区间[8,11] */
int b; /* 长度4 = 4 按4对齐;起始offset=12 12%4=0;存放位置区间[12,15] */
char c; /* 长度 1 = 4 按1对齐;起始offset=16 16%1=0;存放位置区间[16] */
};
成员总大小为17,
整体对齐系数=min(max (double, int, char), 4) = 4;
整个结构体的大小=20,为什么不是上面算出来的17呢?这里涉及到一个叫做“圆整”的概念。
什么叫“圆整”?比如在这个例子,从17开始,看看那个位置可以被“整体对齐系数(4)”整除,17,18,19都不合适,所以到20,圆整结束。
这也解释了为什么第二个结构体开始的位置不能被8整除,其实只要个能被4整除就可以了。
阅读(1097) | 评论(0) | 转发(0) |