C C 中結構體的對齊問題

2021-08-27 21:31:23 字數 572 閱讀 3742

首先需要知道記憶體是按照4位元組對齊的,看下面的結構體

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

再看下面的結構體

#pragma pack(1)

typedef struct st_type;

#pragma pack()

此時編譯器強制結構體元素按照1位元組對齊,什麼意思呢,就是結構體大小就是元素大小之和,sizeof(st_type)=7,這樣以犧牲處理器訪問速度為代價(處理器最喜歡訪問與自己字長對齊的位址的值,一些系統甚至不允許訪問沒有記憶體對齊的資料),達到壓縮空間的目的,同時方便在不同的平台之間傳遞資料(不同平台可能記憶體格仔的大小不一樣,乾脆都按照1位元組對齊),因為資料在buffer中都是緊密底挨著,在解析的時候用1位元組對齊的結構體也方便其轉換。

C C 結構體 struct 對齊問題

以前只記得結構體對齊,是對齊最長的那個成員,但現在發現並不是這樣,看以下兩個示例 64位 g 9.3.0 編譯 class b 8 static int c 0 static int d 0 static int f 0 cout 值得一提的是靜態成員不佔空間 這裡虛指標 8b,char b 1b。...

C C 中的結構體對齊原則

資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,每個資料成員儲存的起始位置要從該成員 每個成員本身 大小的整數倍開始 比如int在32位機為 位元組,則要從 的整數倍位址開始儲存 例子 struct node sizeof node 8...

C C 中的結構體對齊原則

資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,每個資料成員儲存的起始位置要從該成員 每個成員本身 大小的整數倍開始 比如int在32位機為 位元組,則要從 的整數倍位址開始儲存 例子 struct node sizeof node 8...