C的内存对齐

10月 19th, 2006

没看C标准的相关部分,懒的,没查e文的,觉得中文的讲得还可以。(用关键字“C byte alignment”)

搜了一些文档,大概有了了解,又是体系结构不统一、实现不统一等等造成的,sigh。

下面内容大部分从不同的url里摘出来的,不去细分谁是谁了。

———–

不对齐的数据存取在x86上影响速度,因为在不对齐的时候,对一个不超过32位的变量的访问,可能需要超过1次的内存读取。

对齐即是多分配一些字节,填充无用数据。填充的位置可以是结构的中间和尾端。主要遵循的原则,总而言之就是一个:结构以其成员的最大占位为基本单位分配空间,将所有变量逐个填充进去,填不满的补足,直到结构的最后一个变量。
这样,同样的变量成员,放置的先后顺序不一样,结构空间可能也不一样。所以一般遵循把大尺寸的数据变量放在前面,以节约内存:)

编译选项和编译指令(#pragma pack)可以去用户自定制对齐规则。

对齐规则:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2颗推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。

另外就是,x86架构(不清楚是仅硬件相关还是跟os也有关系,好像win和linux都这样的)中,地址空间的布局中,堆向高地址增长,栈向低地址增长。

对于连续的两个栈上变量,发现不同编译器对局部变量的地址分配还有有些区别的。vc6(cl),对单个变量,不管是1个byte,还是2个byte,均分配4个byte的空间,而gcc对单个变量,也是采用压缩的对齐方式。两个连续的1 byte,如果可能,就放在同一个4byte之内了。(在同一台x86的机器上测试过,win2k, gcc3.3.1(MinGW), vc6)

 

http://202.38.75.11/~hupeng/blog/archives/000128.html
简单总结
http://www.zahui.com/html/1/39667.htm
基本的对齐知识
http://post.baidu.com/f?kz=116797427
对于对齐规则的详细解释
http://blog.vckbase.com/panic/archive/2005/04/02/4340.aspx
一个例子(猜测是面试题)和更复杂微妙(subtle)的情况
http://www.yuanma.org/data/2006/0723/article_1213.htm
另一个人的总结
http://blog.csdn.net/goodluckyxl/archive/2005/10/17/506827.aspx
ARM下的对齐方式,__align(num), __packed, 从汇编码看“对齐或非对齐读写访问带来问题”

Entry Filed under: 默认栏目


Calendar

2006-10月
« Sep   Nov »
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

Most Recent Posts