2012年12月14日星期五

linux gcc alignment 字节对齐

为什么对齐:
     方便CPU更快速的读取内存数据,Intel CPU也可以识别不对齐的元素,但效率会慢;而RSIC ARM 不能正确识别未正确对齐的变量
     变量对齐并不是C语言定义的,全由编译器根据当前平台的特性确定,所以不能直接确定某个struct的对齐情况。

三个前提:
    struct可以在元素之间和结尾添加填充字节
    数组内元素之间是不能添加填充字节
    可以创建struct类型的数组,要保证数据第二个元素也对齐

结构体不指定__attribute__((aligned()))属性:
       内置类型以自己的长度作为对齐条件,如 short 2字节对齐,int 4字节对齐;这些类型作为struct内元素时,会影响struct的对齐。
       struct内元素按自己的自身长度对齐,struct以最严格的元素的方式对齐(根据CPU字长看)
               32位PC,字长4字节,结构体内有元素大于4字节时,struct也以4字节对齐
               64位PC,字长8字节,struct内元素有大于等于8字节的元素时,struct以8字节对齐

结构体指定 type attribute __attribute__ ((aligned))属性:
        属性是对编译器的建议,编译器会尽量达成
        __attribute__ ((aligned(4)));   建议编译器此结构体以4字节对齐
        __attribute__ ((aligned));        建议编译器使用对此平台maximum useful alignment,有点扯,我平台测试的和手册结果居然不一样
        aligned 指定的长度也会受linker的限制,有些linker有自己的最大对齐值


参考资料:
http://stackoverflow.com/questions/364483/determining-the-alignment-of-c-c-structures-in-relation-to-its-members
http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Type-Attributes.html#Type-Attributes