结构体内存对齐原则
先來說一下結(jié)構(gòu)體內(nèi)存對齊原則:
1、第一個成員在與結(jié)構(gòu)體偏移量為0的地址處。
2、其他成員變量要對齊到某個數(shù)字(對齊數(shù))的整數(shù)倍的地址處。
注意:對齊數(shù) = 編譯器默認(rèn)的一個對齊數(shù) 與 該成員大小的較小值。
VS中默認(rèn)的對齊數(shù)為8
3、結(jié)構(gòu)體總大小為:最大對齊數(shù)(所有變量類型最大者與默認(rèn)對齊參數(shù)取最小)的整數(shù)倍。
4、如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對齊到自己的最大對齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是所有最大對齊數(shù)(含嵌套結(jié)構(gòu)體的對齊數(shù))的整數(shù)倍。
接下來用代碼實際演示一次:
計算類A1時,大小并不是4+1=5字節(jié),是因為變量a占據(jù)了4個字節(jié),變量b占據(jù)一個字節(jié),此時為5個字節(jié),但是要遵循對齊原則中的第三條:
結(jié)構(gòu)體總大小為:最大對齊數(shù)(所有變量類型最大者與默認(rèn)對齊參數(shù)取最小)的整數(shù)倍。
默認(rèn)對齊數(shù)為8,所有變量類型最大者是int型為4,4的整數(shù)倍為8,所以類A1的字節(jié)大小為8。
計算類A2時,char類型變量b的大小為1,占據(jù)在結(jié)構(gòu)體偏移量為0的地址處,重點在于int a變量,它并不是在char類型后直接就占據(jù)了地址,int a變量在開辟空間的時候,他認(rèn)為內(nèi)存空間是為自己開辟的,所以存放的位置是在自己寬度的整數(shù)倍上開始的。
?如上圖所示,A2的大小為8字節(jié),但是和A1的8字節(jié)不是一種計算方法。
計算A3時,可能會根據(jù)前面的A2計算方法計算出為8+8+4=20,但是實際結(jié)果是24,原因還是要遵循最大對齊數(shù)的整數(shù)倍,最大對齊數(shù)為double型為8字節(jié),20不是8的整數(shù)倍,所以要向后延續(xù)到24字節(jié)。
以上內(nèi)容就是結(jié)構(gòu)體對齊原則,在C++的類中,如果類中有成員變量和成員函數(shù),只需要計算成員變量即可,空類占據(jù)一個字節(jié)。?
總結(jié)
- 上一篇: Notadd 2.0 全新 Node.j
- 下一篇: _0_web_基础