#pragma pack(n) //内存对齐的指定方式
内存对齐就是不同类型的数据在内存中按照一定的规则排列。而不一定是顺序的一个接一个的排列。
比如
struct Test1
{
char c1;
short s1;
char c2;
int i;
};
struct Test2
{
char c1;
char c2;
short s1;
int i;
};
他们占的内存是不一样的。第一个占12个字节,第二个占8个字节。为什么呢?这就是内存对齐
原因如下
cpu对内存的读取不是连续的,而是分块的读取的,块的大小只能是1,2,4,8...等等。读取的数据没对齐,则需要两次总线周期访问内存,因此性能会打折扣。
而#pragma pack 可以用来指定内存对齐方式,能改变内存对齐的方式。
比如#pragma pack(1);
#pragma pack(1)
struct Test1
{
char c1;
short s1;
char c2;
int i;
};
#pragma pack(1)
struct Test2
{
char c1;
char c2;
short s1;
int i;
};
结构体占用内存大小的规则
1第一个成员起始于0偏移处。
2每个成员按其大小和pack参数中较小的一个进行对齐
偏移地址必须能被对齐参数整除,结构体成员的大小取其内部长度最大的数据成元作为其大小。
3机构体长度必须被所有对齐参数的整数倍。
编译器默认为4字节对齐。
#pragma pack(4)
struct Test1
{
//对齐参数(模数) 偏移地址 大小
char c1; // 1 0 1
short s1; // 2 2 2
char c2; // 1 4 1
int i; // 4 8 4
};
#pragma pack(8)//注意这里有的编译器不支持8字节对齐。会自动变成4字节对齐
struct Test3
{ //对齐参数 偏移地址 大小
short c1; //2 0 2
long l; //4 4 4
};
struct Test4
{
//对齐参数 偏移地址 大小
short c1; // 2 0 2
struct Test3 t3;// 4 4 8
double e; // 8 (4) 16 (12) 8 8字节对齐大小为24。4字节对齐大小为20
};
学习交流群199546072