2020-09-08 結(jié)構(gòu)體內(nèi)存對(duì)齊

今天我們來說說結(jié)構(gòu)體內(nèi)存對(duì)齊,廢話少說~~

先上代碼和輸出結(jié)果:



代碼解析:

1.普通結(jié)構(gòu)體

struct MyStruct1 {

? ? double?a;? // 占8字節(jié) ? 起始位置(0-7)

? ? char?b;? ? // 占1字節(jié) ?起始位置(8)

? ? int?c;? ? ? // 占4字節(jié) 因9不是4的整數(shù)倍 所以 起始位置為(12 13 14 15)

? ? short?d;? ? // 占2字節(jié) ?起始位置為?(16 17)

}struct1;

內(nèi)部大小:18 ?(0-17)

最大成員屬性:8?

結(jié)構(gòu)體總大?。??24 ?因?yàn)楸仨毷亲畲蟪蓡T8的整數(shù)倍 18不足 補(bǔ)齊后是 24?

2.嵌套結(jié)構(gòu)體

structMYStruct2 {

? ? doublea;? //占8字節(jié)? (0-7)

? ? intb;? ? ? //占4字節(jié)? (8 9 10 11)

? ? charc;? ? //占1字節(jié)? (12)

? ? shortd;? ? //占2字節(jié)?因13不是2的整數(shù)倍 所以起始位置(14 15)?

? ? struct? MYStruct1 str1; //占24字節(jié) ?16正好是最大成員8的整數(shù)倍所以 起始位置(16 ... 39)

}mystruct2;

內(nèi)部大?。?0 ?(0-39)

最大成員屬性:8?

結(jié)構(gòu)體總大小: ?40 ?因?yàn)楸仨毷亲畲蟪蓡T8的整數(shù)倍 不用補(bǔ)齊 正好~~


總結(jié):結(jié)構(gòu)體內(nèi)存對(duì)齊原則:

1.第?個(gè)數(shù)據(jù)成員放在offset為0的地方

2.后續(xù)的成員起始位置要從該成員大小的整數(shù)倍開始,若該成員是結(jié)構(gòu)體或者數(shù)組等,則從其內(nèi)部最?元素??的整數(shù)倍地址開始存儲(chǔ)

3.結(jié)構(gòu)體的總??,也就是sizeof的結(jié)果,.必須是其內(nèi)部最?成員的整數(shù)倍.不?的要補(bǔ)?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容