#pragma pack([n]) 表示内存对齐,目的是为了优化内存,减少内存碎片,使得内存按照一个固定的规则进行分配,让分配的内存总是n 的倍数。
其中,n = 1,2,4,8,16,32……
(1)Visual C++ 起始地址对齐的倍数规则
在默认情况下,Visual C++规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须是该变量的类型所占用的字节数的倍数。e.g.
#include <iostream>
int main(){
class X{
public:
int a;
char b;
short c;
};
int t = sizeof(X);
return 0;
}
t 正常应为7(=4+1+2),但实际却是为8。为什么?
a | b | c | |||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
(2)#pragma pack 规定的对齐长度规则
规则如下:结构、联合或者类的数据成员第一个放在偏移为0的位置,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员类型长度中取比较小的那个值对齐存放。
(3)#pragma pack的圆整规则
规则如下:在声明#pragma pack(n)的情况下,整个数据类型的长度必须是n的倍数。
#include <iostream>
int main(){
#pragma pack(4)
class X{
public:
int a;
char b;
short c;
char d;
};
int t1 = sizeof(X);
return 0;
}
t1 = 12;//正常应为8,对齐后为9,圆整规则后为12.
PS:
#pragma pack(push,n)表示规则开始有效
#pragma pack(pop)表示规则结束