C/C++中結構體的對齊問題

首先需要知道內存是按照4字節對齊的,看下面的結構體

typedef struct {
    char a;
    char b;
    int c;
    char d;
}ST_TYPE;

內存可以看作長度爲4的挨在一起的格子,首先變量a b,長度爲2,佔用了第一個格子的頭兩個位置;變量c長度爲4,第一個格子已經放不下,只能另起一格,從第二個格子開始放置;然後變量d,第二個格子已經被佔滿,它只能放在第三個格子。由於結構體長度是格子長度的整數倍,因此它佔用了3個格子,所以結構體長度爲12。

再看下面的結構體

#pragma pack(1)
typedef struct {
    char a;
    char b;
    int c;
    char d;
}ST_TYPE;
#pragma pack()

此時編譯器強制結構體元素按照1字節對齊,什麼意思呢,就是結構體大小就是元素大小之和,sizeof(ST_TYPE)=7,這樣以犧牲處理器訪問速度爲代價(處理器最喜歡訪問與自己字長對齊的地址的值,一些系統甚至不允許訪問沒有內存對齊的數據),達到壓縮空間的目的,同時方便在不同的平臺之間傳遞數據(不同平臺可能內存格子的大小不一樣,乾脆都按照1字節對齊)

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