所谓对齐,是指元素存放在内存中的起始地址偏移量(1,2,4,...)。例如,int型数据(size=4),应存放在4的倍数地址的位置上。
数据对齐方便了数据的查询,因为指针的偏移有一定的规律,但是这是以占有更多的内存空间为代价的。
一、struct 自然对齐
元素对齐:按照元素的size进行
整体对齐:按照结构体中size最大元素进行
二、#pragma pack(num)
#pragma pack() 取消对齐
元素对齐: 按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
整体对齐: 按照结构体中最大的数据成员 和 #pragma pack指定值之间,较小的那个进行。
三、
1、struct A{
struct B 对齐以B中最大元素长度为准
}
2、gcc 中最大对其单位 是 4;VC编辑器就不是
四、应用实例
网络编程中传输的数据是结构体时,以往我的做法都是一个元素一个元素的memset,现在可以在定义结构体的时候加上
#pragma pack(1)
struct {
};
#pragma pack()
避免结构体的自动对齐,且可以整体memset
五、实例(gcc编译器)
struct A{
char a1;
int a2;
short a3;
}; sizeof() = 12
struct A{
char a1;
short a3;
int a2;
};sizeof()=8
struct test{
char x1;
short x2;
double x3;
char x4;
};sizeof() = 16
#pragma pack(1)
struct A{
char a1;
int a2;
short a3;
}; sizeof() = 7
#pragma pack(2)
struct A{
char a1;
int a2;
short a3;
}; sizeof() = 8