字節對齊的原因及計算方法

看了網上很多的相關文章,反而容易搞迷糊,在此詳細總結一下,不明白的朋友可以在下方留言。

一、爲什麼需要字節對齊?

       因爲各個硬件平臺對存儲空間的處理上有很大的不同,一些平臺對某些特定類型的數據只能從某些特定地址開始存取。比如有些架構的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;

 

以上兩個例子,足以解釋清楚字節對齊的計算規則。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章