關(guān)于內(nèi)存對(duì)齊

將數(shù)據(jù)放在內(nèi)存上時(shí),對(duì)于存放數(shù)據(jù)的地址有對(duì)齊的限制。

對(duì)齊是指將數(shù)據(jù)放在內(nèi)存上時(shí),必須放置在特定數(shù)值的倍數(shù)的地址上。例如,“必須放置在4的倍數(shù)的地址上”。

最近設(shè)計(jì)的CPU中有著所有的數(shù)據(jù)都必須放置在該數(shù)據(jù)大小的倍數(shù)的地址上這樣的限制。也就是說2字節(jié)的數(shù)據(jù)必須存放在2的倍數(shù)的地址上,4字節(jié)的數(shù)據(jù)必須存放在4的倍數(shù)的地址上。違反上述限制就會(huì)發(fā)生總線錯(cuò)誤,導(dǎo)致程序異常終止。

另外,某些OS中調(diào)用外部函數(shù)時(shí)的棧幀必須以16字節(jié)為邊界排列,例如Windows和Max OS X。

將結(jié)構(gòu)體存放在內(nèi)存上時(shí),其成員的值由前向后依次排列。另外,結(jié)構(gòu)體中各成員有著和各成員的數(shù)據(jù)類型的大小一樣的對(duì)齊限制。即2字節(jié)的數(shù)據(jù)必須存放在2的倍數(shù)的地址上,4字節(jié)的數(shù)據(jù)必須存放在4的倍數(shù)的地址上。這樣一來,像下面這樣大小不一的成員在排列時(shí)就可能形成間隙,這樣的間隙稱為填充(padding)。

struct s {
    char a;
    char b;
    int c;
}

0到1字節(jié)存放a,1到2字節(jié)存放b,4到8字節(jié)存放c,2到4字節(jié)就形成了間隙。

最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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