数据对齐
扫描二维码
随时随地手机看文章
我一直有一个疑问:如果数据int a以4个字节对齐,为什么a的地址一定是4的倍数呢?
数据对齐在c语言中有两种:自然对齐和强制对齐
自然对齐:
以最大字节的数据为标准,其中会因为数据声明顺序而内存大小不同吗?
#includevoid main()
{
struct a
{
int b;
short c;
char d;
}e;
int f;
printf("0x%x,0x%x,0x%x,0x%xn",&e.b,&e.c,&e.d,&f);
}
0x12ff78,0x12ff7c,0x12ff7e,0x12ff74
press any key to continue
这是在VC6.0下编译运行的,可以看出:
1.结构体中的b,c,d地址依次增大。
2.f比e的地址小,因为栈是向下增长的。
3.d的地址不是4的倍数。
最近发现我以前的那个疑问错了,实际情况应该是这样的:
x86结构下linux的对齐策略是2字节数据地址应该是2的倍数,其他长字节数据地址应该是4倍数。windows下策略是k字节地址是k倍数。《深入理解计算机系统》
又有一个疑问:数据对齐了,怎么就能让cpu取数据时效率高呢?





