C語言字節對齊問題總結

       現在打算把自己的掌握的一些東西以博客的形式展現出來,一、作爲自己的筆記,防止以後忘記有個博客可以方便自己查詢,二、分享出來,如果寫的正確可以給還不懂的人一些幫助,如果寫錯了,別人幫忙指出來,對自己也是一種提高。今天這篇博客打算寫一下關於C語言字節對齊的問題。

struct node1{
    char a;
    int b;
    char c;
    int d;
};

struct node2{
    char a;
    char c;
    int b;
    int d;
};

       對於32bit編譯器,sizeof(node1)和sizeof(node2)的大小相等嗎,大小是多少,如果不等,大小分別又是多少?這就是今天我要講的字節對齊問題,如果你掌握了上面的問題你將很容易答上來。

       對齊值:
              對於每一個基礎類型(如:char、int、short、long、double)他們都有一個字節大小(如char佔一個字節等),他們還相對應的存在一個對齊值。但是要明白類型所佔的字節數和對齊值不是一樣大的。對齊值是可以通過#pragma pack (2) /*指定按2字節對齊*/制定,可以通過#pragma pack ()取消。

對於32bit編譯器:
類型 char short int long double
所佔字節 1 2 4 4 8
(缺省)對齊值(byte) 1 2 4 4 4

對於struct的對齊值,等於在其包含的類型中取最大的對齊值,如上面的struct node1的對齊值=4,應該其所包含的類型中對齊值最大的爲int,int的對齊值=4。

我們先運行一段程序,根據程序結果來講解對齊值的概念:
程序如下:
struct node1{
    char a;
    int b;
    char c;
    int d;
};

struct node2{
    char a;
    char c;
    int b;
    int d;
};

int main()
{
    printf("%d,%d\n",sizeof(node1),sizeof(node2));
    return 0;
}

用32bit編譯器,運行結果如下:



       爲什麼node1的結果是16,而node2的結果是12?下面我們來分析一下,
       1)首先我們先判斷node1和node2的對齊值分別是多少,這個答案應該很明顯,它們都是4;
       2)對於node1而言,先存儲1個byte的a,由於對齊值是4,所以後面還有3個byte空餘,接下來存儲4個byte的b,因此存放不下,所以從下一個4byte開始,之前的3個byte只能空閒,以此類推,最後node1佔16個byte。
       3)對於node2而言,先存儲1個byte的a, 由於對齊值是4,所以後面還有3個byte空餘,接下來存儲1個byte的c,能夠存放下,還剩2個空閒的byte,接下來存放4個byte的b,存放不下,從下一個4byte開始,以此類推,最後node2佔12個byte。



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