一.什麼是字節對齊,爲什麼要對齊?
現代計算機中內存空間都是按照byte劃分的,從理論上講似乎類型的變量的訪問可以從任何地址開始,但實際情況是在訪問特定類型變量的時候經常在特定的內存地址訪問,這就需要各種類型數據按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。
對齊的作用和原因:各個硬件平臺對存儲空間的處理上有很大的不同。一些平臺對某些特定類型的數據只能從某些特定地址開始尋址。比如有些CPU在訪問一個沒有進行對齊的變量的時候會發生錯誤,你們在這種CPU下編程必須保證字節對齊,其它CPU可能沒有這種情況,但是最常見的是如果不按照合適其平臺的要求對數據存放進行對齊,會在存取效率上帶來損失,比如有些平臺每次讀都是從偶地址開始,如果一個int型(假設爲32位系統)如果存放在偶地址開始的地方,那麼一個讀週期就可以讀出這32bit,而如果存放在奇地址開始的地方,就需要2個讀週期,並對兩次讀出的結果的高低字節進行拼湊才能得到該32bit數據。顯然在讀取效率上下降很多。
二。請看西門的結構:
struct MyStruct
{
double ddal;
char dda;
int type;
};
對結構MyStruct採用sizeof會出現什麼結果呢?sizeof(MyStruct)爲多少呢?也許你會這樣求:
sizeof(MyStruct) = sizeof(double)+sizeof(char)+sizeof(int) = 13
但是當在VC中測試上面結構的大小時,你會發現sizeof(MyStruct) 爲16,。你知道爲什麼在VC中會得出這樣的一個結果嗎?
其實這是VC對變量存儲的一個特殊處理。爲了提高CPU的存儲速度,VC對一些變量的起始地址做了“對齊”處理。在默認情況下,VC規定各成員變量存放的起始地址相對於結構的起始地址的偏移量必須爲該變量的類型所佔用的字節數的倍數。下面列出常用類型的對齊方式(vc6.0.32位系統).
類型
對齊方式(變量存放的起始地址相對於結構的起始地址的偏移量)
Char
偏移量必須爲sizeof(char)即1的倍數
int
偏移量必須爲sizeof(int)即4的倍數
float
偏移量必須爲sizeof(float)即4的倍數
double
偏移量必須爲sizeof(double)即8的倍數
short
偏移量必須爲sizeof(short)即2的倍數