結構體對齊規則
預設對齊方式,按結構體的成員中 size 最大的成員對齊。拋開成員size來說,一般情況下32位機器預設4位元組對齊,64位機器預設8位元組對齊。
另外可以使用偽指令#pragma pack (n)修改預設的位元組對齊。
1.使用偽指令#pragma pack (n),編譯器將按照 n 個位元組對齊。
2.使用偽指令#pragma pack (),取消自定義位元組對齊方式。
3.如果#pragma pack (n)中指定的 n 大於結構體中最大成員的 size,則其不起作用,結構體仍然按照 size 最大的成員進行對齊。
結構體對齊例子
#includeint main()
; struct test2;
#pragma pack (8)
struct test3;
#pragma pack ()
struct test x;
struct test2 y;
struct test3 z;
printf("sizeof(x):%ld \n",sizeof(x));
printf("sizeof(z):%ld \n",sizeof(y));
printf("sizeof(z):%ld \n",sizeof(z));
}
執行結果:
sizeof(x):3
sizeof(z):12
sizeof(z):12
C語言結構體對齊 記憶體對齊問題
c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?有人給對齊原則做過總結,具體在 看到現在已記不起來,這裡引用一下前人...
C語言結構體對齊問題詳解
c語言結構體對齊問題詳解 測試環境32位機 winxp 編譯器vc6 ms cl.exe 和 mingw32 gcc 4.5.2 1 結構體資料對齊 沒有 pragma pack 巨集定義 結構體對齊可以總結為三個基本原則 資料成員對齊規則 結構體的資料成員中,第乙個成員從offset為0的位址開始...
C語言結構體對齊問題詳解
測試環境32位機 winxp 編譯器vc6 ms cl.exe 和 mingw32 gcc 4.5.2 1 結構體資料對齊 沒有 pragma pack 巨集定義 結構體對齊可以總結為三個基本原則 資料成員對齊規則 結構體的資料成員中,第乙個成員從offset為0的位址開始,以後每乙個成員儲存的起始...