看了網上很多的相關文章,反而容易搞迷糊,在此詳細總結一下,不明白的朋友可以在下方留言。
一、爲什麼需要字節對齊?
因爲各個硬件平臺對存儲空間的處理上有很大的不同,一些平臺對某些特定類型的數據只能從某些特定地址開始存取。比如有些架構的CPU在訪問一個沒有進行對齊的變量的時候會發生錯誤,那麼在這種架構下編程必須保證字節對齊.其他平臺可能沒有這種情況,但是最常見的是如果不按照適合其平臺要求對數據存放進行對齊,會在存取效率上帶來損失。比如有些平臺每次讀都是從偶地址開始讀的,如果一個int型(假設爲32位系統)如果存放在偶地址開始的地方,那麼一個讀週期就可以讀出這32bit,而如果存放在奇地址開始的地方,就需要2個讀週期,並對兩次讀出的結果的高低字節進行拼湊才能得到該32bit數據。顯然在讀取效率上下降很多。因此,字節對齊規則誕生。
二、字節對齊計算方法
首先看結構體中哪一個變量所佔的字節數最大,然後後面的對齊計算都以這個爲基數(我這裏以4字節爲例)。接着,你把每一個成員變量的大小依次相加(按照結構體定義中的順序,從第一個加到最後一個)。當你加到某一個變量的時候,發現超過了4個字節,那麼就把這個變量之前的內容當作是一個整體,後面的再從0開始繼續這個過程。
舉例說明:
例一:
struct test1
{
char a;
int b;
char c;
};
通過上面的方法計算,可得基數爲4字節,即4字節對齊。sizeof(test1) = 12;
例二:(僅僅只是將例一中的成員聲明調換了順序)
struct test2
{
char a;
char c;
int b;
};
基數爲4字節,即4字節對齊。sizeof(test2) = 8;
以上兩個例子,足以解釋清楚字節對齊的計算規則。