- 论坛徽章:
- 0
|
原帖由 liuke432 于 2006-12-18 12:36 发表
感谢各位,基本上明白了。
感觉下面这个规则表达的比较清楚
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体 ...
这个说的已经比较清楚了,但需要注意的是,并不是只有结构体才对齐,内存中的变量一般都要求对齐。
对齐规则大概总结是这样的:
linux一般采用这样的对齐策略:2字节的数据类型地址必须是2的倍数,也就是两字节对齐。较大的数据类型如int、指针,地址应该是4的倍数,也就是4字节对齐。(当我在最近的kernel版本2.6.16.33中看到的似乎更像是下面提到的微软对齐原则)
微软的对齐更为严格,n字节的基本对象的地址为n的倍数,例如double类型的地址必须是8的倍数。
可以运行下面的程序,会发现几个变量不是紧密排列的,通过各个变量的地址,就可以知道自己机器上的是如何对齐的了:
- 1 #include <stdio.h>
- 2
- 3 int main()
- 4 {
- 5 char a;
- 6 int b;
- 7 double c;
- 8 short d;
- 9
- 10 printf("%p\t%p\t%p\t%p\n", &a, &b, &c, &d);
- 11 }
复制代码 |
|