__attribute__((align(n)))字节对齐问题,作用和#pragma不一致
问题:#pragma pack(n) #pragma pack() 对字节对齐的作用已经掌握了,网上搜索得知__attribute__((align(n)))有同样功效,但是经过写小程序出现以下现象:
1.#pragma pack(n), 如果n大于此结构体中最大基本数据类型size,那么依据最大基本数据类型size对齐;否则,依据n进行对齐;#pragma pack() 用来取消默认对齐方式,默认对齐依据最大基本数据类型size进行对齐。
2.__attribute__((align(n))), 如果n大于此结构体中小大基本数据类型size,那么依据最大基本数据类型size对齐;否则,依据n进行对齐;__attribute__((packed))用来取消对齐优化,即默认单字节对齐,注意不等同于__attribute__((align(1)))。
3.假设一个结构体是:
struct A{
unsigned long a;
unsigned long b;
}__attribute__((align(8)));
另一个结构体是:
struct B{
char a;
unsigned long b;
unsigned short c;
char d;
}__attribute__((align(8)));
则sizeof( A ) = 8; sizeof( B ) = 16;
以上,请问__attribute__((align(n)))到底真实意义是什么?而A和B都是同样大小的结构体,为什么结果不同?
已查到的资料:
#pragma告诉编译器结构体或类内部的成员变量相对于第一个变量的地址的偏移量的对齐方式,缺省情况下,编译器按照自然边界对齐,当变量所需的自然对齐边界比n大 时,按照n对齐,否则按照自然边界对齐;后者告诉编译器一个结构体或者类或者联合或者一个类型的变量(对象)分配地址空间时的地址对齐方式。
也就是说,如 果将__attribute__((aligned(m)))作用于一个类型,那么该类型的变量在分配地址空间时,其存放的地址一定按照m字节对齐(m必 须是2的幂次方)。并且其占用的空间,即大小,也是m的整数倍,以保证在申请连续存储空间的时候,每一个元素的地址也是按照m字节对齐。 __attribute__((aligned(m)))也可以作用于一个单独的变量。