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