規(guī)則:
1 、數(shù)據(jù)成員對(duì)齊規(guī)則:結(jié)構(gòu) (struct)( 或聯(lián)合 (union)) 的數(shù)據(jù)成員,第一個(gè)數(shù)據(jù)成員放在 offset 為 0 的地方,以后每個(gè)數(shù)據(jù)成員的對(duì)齊按照 #pragma pack 指定的數(shù)值和這個(gè)數(shù)據(jù)成員自身長(zhǎng)度中,比較小的那個(gè)進(jìn)行。
2 、結(jié)構(gòu) ( 或聯(lián)合 ) 的整體對(duì)齊規(guī)則:在數(shù)據(jù)成員完成各自對(duì)齊之后,結(jié)構(gòu) ( 或聯(lián)合 ) 本身也要進(jìn)行對(duì)齊,對(duì)齊將按照 #pragma pack 指定的數(shù)值和結(jié)構(gòu) ( 或聯(lián)合 ) 最大數(shù)據(jù)成員長(zhǎng)度中,比較小的那個(gè)進(jìn)行。
3 、結(jié)合 1 、 2 可推斷:當(dāng) #pragma pack 的 n 值等于或超過(guò)所有數(shù)據(jù)成員長(zhǎng)度的時(shí)候,這個(gè) n 值的大小將不產(chǎn)生任何效果。 使用指令#pragma pack (n),編譯器將按照 n個(gè)字節(jié)對(duì)齊。使用指令#pragma pack (),編譯器將取消自定義字節(jié)對(duì)齊方式。在#pragma pack (n)和#pragma pack ()之間的代碼按 n個(gè)字節(jié)對(duì)齊。
struct s1
{
int a;
char b;
short e;
int c;
};
struct s2
{
int a;
char b;
int c;
short e;
int d;
};
1字節(jié)對(duì)齊 為 11 和 15
2字節(jié)對(duì)齊 為 11 和 16
4字節(jié)對(duì)齊 為 12 和 20
8字節(jié)對(duì)齊 為 12 和 20
16字節(jié)對(duì)齊 為 12 和 20
看如下例子:
#pragma pack(8)
struct TestStruct4
{
char a;
long b;
};
struct TestStruct5
{
char c;
TestStruct4 d;
long long e;
};
#pragma pack()
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |