结构体对齐问题
#pragma (1)
typedef struct
{
};
#pragma ()
#pragma pack(1) 的意義是什么
skypxl?|?瀏覽 27771 次
發(fā)布于2009-10-01 16:38
最佳答案
設(shè)置結(jié)構(gòu)體的邊界對(duì)齊為1個(gè)字節(jié),也就是所有數(shù)據(jù)在內(nèi)存中是連續(xù)存儲(chǔ)的。
比如你在C語言中定義下面這樣的結(jié)構(gòu)體:
struct s {
char ch;
int i;
};
然后在主函數(shù)中寫一句:printf("%d", sizeof(struct s))
也就是輸出結(jié)構(gòu)體s所占的字節(jié)數(shù)
你覺得輸出結(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型成員雖然本來只有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了。
轉(zhuǎn)載于:https://www.cnblogs.com/elseliving/p/7528866.html
總結(jié)
- 上一篇: InnoDB引擎与MyIASM的一点总结
- 下一篇: c# gerber文件读取_gerber