在使用gcc的时候,特别是阅读源码的时候会看到
#pragma pack(n)
#pragma pack()
和
__attribute((aligned (8)))
__attribute__ ((packed));
下面写一下我的一点认识,不一定对,欢迎指正
这两种方式是gcc的c扩展,用来对齐的,包括栈对齐,变量地址对齐内存分配对齐,这几种方式一般来说gcc是兼容的
#pragma pack(n)
n的取值可以为1、2、4、8、16,在编译过程中按照n个字结对齐
#pragma pack()
取消对齐,按照编译器的优化对齐方式对齐
__attribute__ ((packed));
是说取消结构在编译过程中的优化对齐。
__attribute__ ((aligned (n)));
让所作用的成员对齐在n字节自然边界上,如果结构中有成员的长度大于n,则按照最大成员的长度来对。
我写了一个小测试程序来测验 struct a
{
int a;
char b;
char c;
}aa; /* 编译器默认对齐方式,32位机器,按照32位对齐 */
#pragma pack(1)
struct b
{
int a;
char b;
char c;
}bb; /* 按照8位对齐 */
#pragma pack()
#pragma pack(2)
struct c
{
int a;
char b;
char c;
}cc;/* 按照16位对齐 */
#pragma pack()
#pragma pack(4)
struct d
{
int a;
char b;
char c;
}dd; /* 按照32位对齐 */
#pragma pack()
#pragma pack(8)
struct e
{
int a;
char b;
char c;
}ee; /* 按照64位对齐 */
#pragma pack()
#pragma pack(16)
struct f
{
int a;
char b;
char c;
}ff; /* 按照128位对齐 */
#pragma pack()
struct m
{
int a;
char b;
char c;
}__attribute__((packed)) mm;
/* 取消编译器优化对齐,取实际长度 */
struct n
{
int a;
char b;
}__attribute__((aligned(1))) nn;
/* 按照32位对齐 */
struct o
{
long long a;
char b;
char c;
}__attribute__((aligned(2))) oo;
/* 按照64位对齐 */
struct p
{
int a;
char b;
char c;
}__attribute__((aligned(4))) pp;
/* 按照32位对齐 */
struct q
{
int a;
char b;
char c;
}__attribute__((aligned(8))) qq;
/* 按照64位对齐 */
struct r
{
int a;
char b;
char c;
}__attribute__((aligned(8*1024))) rr;
/* 按照512位对齐 */
int main()
{
printf("%d,%d,%d,%d,%d,%d\n",
sizeof(aa),sizeof(bb),sizeof(cc),
sizeof(dd),sizeof(ee),sizeof(ff));
printf("%d,%d,%d,%d,%d,%d\n",
sizeof(mm),sizeof(nn),sizeof(oo),
sizeof(pp),sizeof(qq),sizeof(rr));
return 0;
}
|
阅读(2183) | 评论(0) | 转发(0) |