C/C++的記憶體對齊
阿新 • • 發佈:2020-11-28
所謂記憶體對齊,是為了讓記憶體存取更有效率而採用的一種編譯階段優化記憶體存取的手段。
在Windows系統下,C/C++一般對於int、float、double這種變數分配的記憶體和型別本身的大小是一致的,也就是分別是4、4和8個位元組。
但是對於Struct或者是Class型別就不一樣了,遵循著以下的原則:
1.為成員變數分配記憶體的順序是按照宣告的順序
2.每一個成員變數的偏移值必須是該變數所屬型別位元組的倍數,第一個成員變數的偏移值是0
3.結構體整體的大小必須是裡面變數型別最大值的整數倍
下面我們來看一個例子:
struct A { char m1; unsigned int m2; char m3; double m4; char m5; };
這個結構體型別的變數如果直接按照子成員大小累加的話,那麼是15。但按照上面寫的原則來看的話,那麼應該是:
第一個變數m1偏移是0,沒啥說的,佔位為1。
m2的大小為4,為了保證原則2(偏移值必須是該變數所屬型別位元組的倍數),必須在m1之後為它多分配三個位元組的空間,那麼m2的偏移為4。
m3接在m2之後,偏移為5。
m4本身大小為8,為了保證原則2,那麼在m3之後需要多留7個位元組的空間,所以m4偏移為16。
m4偏移為25,但是為了滿足原則3,需要在m4之後分配7個位元組的空間(結構體中最大的變數是m4)。
所以,sizeof(A)實際的值是32。