准则
四个重要的基本概念
1.数据类型自身的对齐值:
对于char型数据,其自身对齐值为1,对于short型为2,对于int,float类型,其自身对齐值为4单位字节。自己机器上以自己用sizeof测试的为准。
2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。
3.指定对齐值:#pragma pack (value)时的指定对齐值value。
4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。
对齐规则
一个有价值的评论:
50L
#pragma pack(n)和__attribute__((aligned(m))), 是有区别的,详见:http://itbeebee.blog.sohu.com/106643640.html
前者告诉编译器结构体或类内部的成员变量相对于第一个变量的地址的偏移量的对齐方式,缺省情况下,编译器按照自然边界对齐,当变量所需的自然对齐边界比n大时,按照n对齐,否则按照自然边界对齐;
后者告诉编译器一个结构体或者类或者联合或者一个类型的变量(对象)分配地址空间时的地址对齐方式。也就是所,如果将__attribute__((aligned(m)))作用于一个类型,那么该类型的变量在分配地址空间时,其存放的地址一定按照m字节对齐(m必须是2的幂次方)。并且其占用的空间,即大小,也是m的整数倍,以保证在申请连续存储空间的时候,每一个元素的地址也是按照m字节对齐。__attribute__((aligned(m)))也可以作用于一个单独的变量。
#pragma pack(n)偏重于结构体的每个成员
__attribute__((aligned(m))偏重于结构体本身