結構體對齊方式:
1. #pragma pack[x],32系統預設值4,結構體元素最大長度,取三者最小值,作為每個元素對齊計算的值的倍數,並且總和是最小值的倍數!(假的)
於2015/12/26/修改
1. 資料成員對齊原則
結構或聯合的資料成員,第乙個資料成員放在offset為0的地方,以後每個成員按照#pragma pack(n)和成員本身值比較小那個進行對齊,offset是該值的整數倍
2. 整體對齊原則
在資料成員完成各自對齊之後,結構或聯合本身也要對齊,對齊原則按照#pragma pack(n)指定的數值和結構最大資料成員長度中,比較小的那個值進行比較
3.巢狀結構體對齊原則
巢狀的內部結構體對齊原則是按照該結構體內部的最長元素與pragma指定的n最小值作為對齊的值
4.陣列對齊原則
按照陣列型別算,比如char a[3],實際上是按照1個位元組對齊的,offset還是按照陣列大小
5. 如果沒有定義#pragma pack(),則按照自身的長度對齊
#include
#include
//#pragma pack(1)
struct demo
;struct test
;struct module
;int main(void)
{ printf("sizeof(test) is %d\n", sizeof(struct test));
參考:
結構體對齊
現在去掉第乙個成員變數為如下 pragma pack 4 class testc int nsize sizeof testc 按照正常的填充方式nsize的結果應該是8,為什麼結果顯示nsize為6呢?事實上,很多人對 pragma pack的理解是錯誤的。pragma pack規定的對齊長度,實...
結構體對齊
結構體對齊問題 以下結論均在gnu gcc上驗證 概念 偏移量 成員位址相對結構體位址的偏移 對齊原則 1.結構體中某成員的偏移量必須是該成員型別大小的整數倍 b 的偏移量必須是 short 大小的整數倍,故在 a 後面填充乙個位元組 c 的 型別大小是double,在ansi c中,c 的偏移量是...
結構體對齊
c 資料對齊 為了避免混淆,做如下規定,以下 若不加特殊說明都執行於32位平台,結構體的預設對齊值是8,各資料型別所佔位元組數分別為 char佔乙個位元組 int佔四個位元組 double佔八個位元組。請問下面的結構體大小是多少?struct test 這個呢?struct test1 在公布答案之...