把以前跳過去的幾節補一下
對齊就是指為了提高處理器的效率,把某些基礎類型的地址規定為必須是某個值(通常是2,4或8)的整數倍。
如果不這樣處理,例如把一個double值分開存放在地址為8*n的兩邊,處理器每次從內存中讀取8字節,這樣就需要讀取兩次才能得到這個double值了。
Linux的做法是把2字節數據(如short)存放在偶數的地址中,把其他更大的數據(int, int *, float, double)放在以4為約數的地址中。
Windows則使用了相對現代的處理器而言更好的做法,任何k字節的數據必須存放在以k的倍數為起始的地址中,即double必須存放在以8*n為起始的地址中。
GCC的編譯開關-malign-double也可以達到這種效果,但因此可能導致與某些假定4字節對齊方式的庫的鏈接錯誤。
一個簡單的例子:
struct S1 {
int i;
char c;
int j;
};
對齊后的保存方式為
0-4: i
4-5: c
8-12: j
對齊就是指為了提高處理器的效率,把某些基礎類型的地址規定為必須是某個值(通常是2,4或8)的整數倍。
如果不這樣處理,例如把一個double值分開存放在地址為8*n的兩邊,處理器每次從內存中讀取8字節,這樣就需要讀取兩次才能得到這個double值了。
Linux的做法是把2字節數據(如short)存放在偶數的地址中,把其他更大的數據(int, int *, float, double)放在以4為約數的地址中。
Windows則使用了相對現代的處理器而言更好的做法,任何k字節的數據必須存放在以k的倍數為起始的地址中,即double必須存放在以8*n為起始的地址中。
GCC的編譯開關-malign-double也可以達到這種效果,但因此可能導致與某些假定4字節對齊方式的庫的鏈接錯誤。
一個簡單的例子:
struct S1 {
int i;
char c;
int j;
};
對齊后的保存方式為
0-4: i
4-5: c
8-12: j