1. 程式人生 > >什麼是記憶體對齊?為什麼要記憶體對齊?

什麼是記憶體對齊?為什麼要記憶體對齊?

要了解為什麼要記憶體對齊,首先我們要了解什麼是記憶體對齊

  • 什麼是記憶體對齊
    關於什麼是記憶體對齊,我們先來看幾個例子
typedef struct {
    int a;
    double b;
    short c;
}A;
typedef struct {
    int a;
    short b;
    double c;
}B;

分別對他們求大小,sizeof(A),sizeof(B)我們所得到的結果是不同的,
sizeof(A)=24而sizeof(B)=16為什麼會產生不一樣的結果呢?
這是非常簡單的一個例子,體現了結構體的記憶體對齊規則。
在結構體中,從結構體的首地址開始,假設地址從0開始。
對結構體A來說,a佔4個位元組,佔從0~3的位元組,b是double型別佔8個位元組,佔從8~15的位元組,c佔兩個位元組,從16~17的位元組。
對結構體B來說,a佔4個位元組,從0~3,b佔兩個位元組從4~6;c佔8個位元組從8~15。
這就是記憶體對齊,對齊規則是按照成員的宣告順序,依次安排記憶體,其偏移量為成員大小的整數倍,0看做任何成員的整數倍,最後結構體的大小為最大成員的整數倍(所以這裡的A的大小是24,而不是18)。

  • C語言和C++中空類和空結構體的大小
    在C++中規定了空結構體和空類的記憶體所佔大小為1位元組,因為c++中規定,任何不同的物件不能擁有相同的記憶體地址。
    而在C語言中,空的結構體在記憶體中所佔大小為0。(gcc中測試為0,其他編譯器不一定)

  • 為什麼要記憶體對齊?
    1.平臺原因(移植原因):不是所有的硬體平臺都能訪問任意地址上的任意資料的;某些硬體平臺只能在某些地址處取某些特定型別的資料,否則丟擲硬體異常。
    2.效能原因:資料結構(尤其是棧)應該儘可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。