内存字节对齐是GCC编译器对C语言进行的扩展。在缺省情况下,C编译器为每一个变量或是数据单元按其自然边界对齐条件分配空间。同时GCC编译器规定了两种内存字节对齐的方法:A、伪指令方式#pragma pack(n) //n的取值可以为1、2、4、8,在编译过程中按照n个字节对齐 #pragma pack() //取消指定对齐,按照编译器的优化对齐方式对齐 GCC编译器不建议使用#pragma进行内存字节对齐,而且#pragma最多只能支持8字节的对齐。如果n大于8则编译器会报警告,编译器将会按8字节对齐。warning: alignment must be a small power of two, not 9 [-Wpragmas]B、属性设置方式__attribute__ ((packed)); //取消结构在编译过程中的优化对齐。 __attribute__ ((aligned (n))); //让所作用的结构体、类的成员对齐在n字节自然边界上,如果结构中有成员的长度大于n,则按照机器字长来对齐。n=1,2,4,8,16…GCC推荐使用方式C、两种对齐方式的区别 #pragma pack(n) 对齐方式告诉编译器结构体或类内部的成员变量相对于第一个变量的地址的偏移量的对齐方式,缺省情况下,编译器按照自然边界对齐,当变量所需的自然对齐边界比n大时,按照n对齐,当变量所需的自然对齐边界比n小时,按照自然边界对齐。n最大只能为8。__attribute__((aligned(m)))对齐方式告诉编译器一个结构体或者类或者联合或者类型的变量(对象)分配地址空间时的地址对齐方式。如果__attribute__((aligned(m)))作用于一个类型,那么该类型的变量在分配地址空间时,其存放的地址一定按照m字节对齐(m必须是2的幂次方);如果类型中的成员的自然边界对齐值大于m,则按照机器字长对齐。类型占用的空间,即大小,是m的整数倍,以保证在申请连续存储空间的时候,每一个元素的地址也是按照m字节对齐。 实例对比如下:struct test{ char a; int b; short c; char *p; double d;}__attribute__((aligned(4)));//实际有效指定对齐值为8字节(机器字长)sizeof(struct test);//32字节#pragma pack(4)struct test{ char a; int b; short c; char *p; double d;};//指定对齐值小于结构体中成员的自然边界对齐值8字节,有效对齐值为4字节#pragma pack()sizeof(struct test);//28字节
三、内存字节对齐实例
环境:Ubuntu x64,GCC 4.6.3 代码示例: 1字节对齐:#pragma pack(1)struct test{ char a; int b; short c;};#pragma pack()sizeof(struct test);//7字节 结构体成员中数据类型对齐的最大值为4字节,指定对齐值为1字节,结构体整体对齐值为1字节 2字节对齐:#pragma pack(2)struct test{ char a; int b; short c;};#pragma pack()sizeof(struct test);//8字节结构体成员中数据类型对齐的最大值为4字节,指定对齐值为2字节,结构体整体对齐值为2字节 4字节对齐: #pragma pack(4)struct test{ char a; int b; short c;};#pragma pack()sizeof(struct test);//12字节 结构体成员中数据类型对齐的最大值为4字节,指定对齐值为4字节,结构体整体对齐值为4字节 8字节对齐:#pragma pack(8)struct test{ char a; int b; short c;};#pragma pack()sizeof(struct test);//12字节 结构体成员中数据类型对齐的最大值为4字节,指定对齐值为8字节,结构体整体对齐值为4字节#pragma pack(12)struct test{ char a; int b; short c; double d;};sizeof(struct test);//24字节 结构体成员中数据类型对齐的最大值为8字节,指定对齐值为8字节,结构体整体对齐值为8字节struct test{ char a; int b; short c; double d;}__attribute__((aligned(2)));sizeof(struct test);//24字节 结构体成员中数据类型对齐的最大值为8字节,有效指定对齐值为8字节(指定对齐值为2字节,小于结构体中成员的最大自然边界对齐值8字节,对齐值为机器字长8字节),结构体整体对齐值为8字节struct test{ char a; int b; short c; char *p; double d;}__attribute__((aligned(2)));sizeof(struct test);//32字节 结构体成员中数据类型对齐的最大值为8字节,有效指定对齐值为8字节(指定对齐值为2字节,小于结构体中成员的最大自然边界对齐值8字节,对齐值为机器字长8字节),结构体整体对齐值为8字节struct test{ char a; int b; short c; char vector[10]; char *p; double d;}__attribute__((aligned(16)));sizeof(struct test);//48字节