#pragma pack(1) 的意义是什么
設(shè)置結(jié)構(gòu)體的邊界對(duì)齊為1個(gè)字節(jié),也就是所有數(shù)據(jù)在內(nèi)存中是連續(xù)存儲(chǔ)的。
 比如你在C語(yǔ)言中定義下面這樣的結(jié)構(gòu)體:
 ?
 然后在主函數(shù)中寫(xiě)一句:printf("%d", sizeof(struct s))
 也就是輸出結(jié)構(gòu)體s所占的字節(jié)數(shù)
 你覺(jué)得輸出結(jié)果會(huì)是多少呢?
 我們知道,char型占用1個(gè)字節(jié),int型占4個(gè)字節(jié),那么輸出的結(jié)果是5嗎?
 答案是否定的。你可以自己試一下,輸出結(jié)果為8。
 為什么會(huì)這樣呢?這是因?yàn)榫幾g器為了讓程序跑得跟快,減少CPU讀取數(shù)據(jù)的指令周期,對(duì)結(jié)構(gòu)體的存儲(chǔ)進(jìn)行了優(yōu)化。實(shí)際上第一個(gè)char型成員雖然本來(lái)只有1個(gè)字節(jié),但實(shí)際上卻占用掉了4個(gè)字節(jié),為的是讓第二個(gè)int型成員的地址能夠被4整除。因此實(shí)際占用的是8個(gè)字節(jié)。
 而#pragma pack(1)讓編譯器將結(jié)構(gòu)體數(shù)據(jù)強(qiáng)制連續(xù)排列,這樣的話,sizeof(struct s)輸出的結(jié)果就是5了。
?
實(shí)例一:
#pragma?pack(push) //保存對(duì)齊狀態(tài)
#pragma pack(4)//設(shè)定為4字節(jié)對(duì)齊
struct test
{
char m1;
double m4;
int m3;
};
#pragma pack(pop)//恢復(fù)對(duì)齊狀態(tài)
實(shí)例二:
#pragma pack (2)
struct C {
char b;
int a;
short c;
};
#pragma pack () /*取消指定對(duì)齊,恢復(fù)缺省對(duì)齊,等價(jià)于#pragma pack(pop)*/
?
總結(jié)
以上是生活随笔為你收集整理的#pragma pack(1) 的意义是什么的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: matlab实现一/多元线性回归
- 下一篇: 7. OD-破解收费版限制天数的软件
