#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)表示規則結束