- 相關(guān)推薦
解析C語言結(jié)構(gòu)體對齊(內(nèi)存對齊問題)
C語言結(jié)構(gòu)體對齊也是老生常談的話題了;旧鲜敲嬖囶}的必考題。內(nèi)容雖然很基礎(chǔ),但一不小心就會弄錯。寫出一個struct,然后sizeof,你會不會經(jīng)常對結(jié)果感到奇怪?sizeof的結(jié)果往往都比你聲明的變量總長度要大,這是怎么回事呢?下面讓我們一起來學習一下相關(guān)的知識吧!
解析C語言結(jié)構(gòu)體對齊(內(nèi)存對齊問題)
開始學的時候,也被此類問題困擾很久。其實相關(guān)的文章很多,感覺說清楚的不多。結(jié)構(gòu)體到底怎樣對齊?
有人給對齊原則做過總結(jié),具體在哪里看到現(xiàn)在已記不起來,這里引用一下前人的經(jīng)驗(在沒有#pragma pack宏的情況下):
原則1、數(shù)據(jù)成員對齊規(guī)則:結(jié)構(gòu)(struct或聯(lián)合union)的數(shù)據(jù)成員,第一個數(shù)據(jù)成員放在offset為0的地方,以后每個數(shù)據(jù)成員存儲的起始位置要從該成員大小的整數(shù)倍開始(比如int在32位機為4字節(jié),則要從4的整數(shù)倍地址開始存儲)。
原則2、結(jié)構(gòu)體作為成員:如果一個結(jié)構(gòu)里有某些結(jié)構(gòu)體成員,則結(jié)構(gòu)體成員要從其內(nèi)部最大元素大小的整數(shù)倍地址開始存儲。(struct a里存有struct b,b里有char,int,double等元素,那b應(yīng)該從8的整數(shù)倍開始存儲。)
原則3、收尾工作:結(jié)構(gòu)體的總大小,也就是sizeof的結(jié)果,必須是其內(nèi)部最大成員的整數(shù)倍,不足的要補齊。
這三個原則具體怎樣理解呢?我們看下面幾個例子,通過實例來加深理解。
【解析C語言結(jié)構(gòu)體對齊(內(nèi)存對齊問題)】相關(guān)文章:
Word兩端對齊和分散對齊08-29
C語言中內(nèi)存分配問題09-13
C語言結(jié)構(gòu)體定義06-25
C語言結(jié)構(gòu)體教程06-17
2016計算機二級C++內(nèi)存對齊詳細使用指南06-18
word圖片批量居中對齊10-14
如何實現(xiàn)CSS右對齊10-29