c語言結(jié)構(gòu)體對(duì)齊規(guī)則 內(nèi)存對(duì)齊的目的和規(guī)則?
內(nèi)存對(duì)齊的目的和規(guī)則??jī)?nèi)存對(duì)齊原則有四個(gè):1).數(shù)據(jù)成員對(duì)齊規(guī)則:結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第一個(gè)數(shù)據(jù)成員放在offset為0的地方,以后每個(gè)數(shù)據(jù)成員存儲(chǔ)的起始位置要從該
內(nèi)存對(duì)齊的目的和規(guī)則?
內(nèi)存對(duì)齊原則有四個(gè):
1).數(shù)據(jù)成員對(duì)齊規(guī)則:結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第一個(gè)數(shù)據(jù)成員放在offset為0的地方,以后每個(gè)數(shù)據(jù)成員存儲(chǔ)的起始位置要從該成員大小或者成員的子成員大小(只要該成員有子成員,比如說是數(shù)組,結(jié)構(gòu)體等)的整數(shù)倍開始(比如int在32位機(jī)為4字節(jié), 則要從4的整數(shù)倍地址開始存儲(chǔ)),基本類型不包括struct/class/uinon。
2).結(jié)構(gòu)體作為成員:如果一個(gè)結(jié)構(gòu)里有某些結(jié)構(gòu)體成員,則結(jié)構(gòu)體成員要從其內(nèi)部"最寬基本類型成員"的整數(shù)倍地址開始存儲(chǔ).(struct a里存有struct b,b里有char,int ,double等元素,那b應(yīng)該從8的整數(shù)倍開始存儲(chǔ).)。
3).收尾工作:結(jié)構(gòu)體的總大小,也就是sizeof的結(jié)果,.必須是其內(nèi)部最大成員的"最寬基本類型成員"的整數(shù)倍.不足的要補(bǔ)齊.(基本類型不包括struct/class/uinon)。
4).sizeof(union),以結(jié)構(gòu)里面size最大元素為union的size,因?yàn)樵谀骋粫r(shí)刻,union只有一個(gè)成員真正存儲(chǔ)于該地址。
如何理解struct的內(nèi)存對(duì)齊?
C中的結(jié)構(gòu)體對(duì)齊問題 結(jié)構(gòu)體所占的位數(shù)要是結(jié)構(gòu)體成員中所占位數(shù)最長(zhǎng)的那個(gè)數(shù)據(jù)的整數(shù)倍,在這個(gè)結(jié)構(gòu)體中 結(jié)構(gòu)體所占的位數(shù)是double型的整數(shù)倍。這個(gè)結(jié)構(gòu)體雖然使用了位域,但是對(duì)結(jié)果沒有影響。int i 占4個(gè)字節(jié),char j占一個(gè)字節(jié),這倆總共要占8個(gè)字節(jié),雖然后面的3個(gè)字節(jié)沒有用。int a 本身占個(gè)4個(gè)字節(jié),但與結(jié)構(gòu)體對(duì)齊,要占8個(gè)字節(jié)。double b占8個(gè)字節(jié)??偣矠? 8 8=24個(gè)字節(jié)
內(nèi)存對(duì)齊的規(guī)則?
為了加快計(jì)算機(jī)的取數(shù)速度,編譯器默認(rèn)對(duì)內(nèi)存進(jìn)行字節(jié)對(duì)齊。對(duì)結(jié)構(gòu)體(包括類)進(jìn)行字節(jié)對(duì)齊的原則是:
1)結(jié)構(gòu)體變量的首地址能夠被其最寬基本類型成員的大小所整除;
2)結(jié)構(gòu)體每個(gè)成員相對(duì)于結(jié)構(gòu)體首地址的偏移量(offset)都是成員大小的整數(shù)倍,如有需要編譯器會(huì)在成員之間加上填充字節(jié)(internaladding);
3)結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍,如有需要編譯器會(huì)在最末一個(gè)成員之后加上填充字節(jié)(trailingpadding)。structSByte1{doubled//偏移量0~7charj//偏移量8inta//偏移量12~15,由于9不能整除4,故先填充9~11}sizeof(SByte1)//=16structSByte2{charj//偏移量0doubled//偏移量8~15,由于1不能整除8,故先填充1~7inta//偏移量16~19}sizeof(SByte2)//=24,為了湊成8的倍數(shù),填充20~23
c語言中變量存儲(chǔ)為什么要內(nèi)存對(duì)齊?
為了有助于加快計(jì)算機(jī)的取數(shù)速度,編譯器默認(rèn)會(huì)對(duì)結(jié)構(gòu)體進(jìn)行處理(實(shí)際上其它地方的數(shù)據(jù)變量也是如此),讓寬度為2的基本數(shù)據(jù)類型(short等)都位于能被2整除的地址上,讓寬度為4的基數(shù)據(jù)類型(int等)都位于能被4整除的地址上,以此類推。這樣,兩個(gè)數(shù)中間就可能需要加入填充字節(jié),所以整個(gè)結(jié)構(gòu)體的sizeof值就增長(zhǎng)了。
字節(jié)對(duì)齊的細(xì)節(jié)和編譯器實(shí)現(xiàn)相關(guān),但一般而言,滿足三個(gè)準(zhǔn)則:
1) 結(jié)構(gòu)體變量的首地址能夠被其最寬基本類型成員的大小所整除;
2) 結(jié)構(gòu)體每個(gè)成員相對(duì)于結(jié)構(gòu)體首地址的偏移量(offset)都是成員大小的整數(shù)倍,如有需要編譯器會(huì)在成員之間加上填充字節(jié)(internal adding);
3) 結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍,如有需要編譯器會(huì)在最末一個(gè)成員之后加上填充字節(jié)(trailing padding)。