chinaunix最近有個貼子討論熱烈,在這裡記錄一下我的理解,struct的對齊是遵照下列二個條件中最小的乙個進行的:
1.#pragma pack(n)中n指定的值
2.struct中最大的成員(請注意不是指sizeof值最大的那個,而應當是__alignof__值最大的那個)
對於double等幾個型別,它的alignof值是可通過編譯開關-mno-align-double和-malign-double來控制的,其中-mno-align-double表示double的alignof值為字長,而-mno-align-double表示alignof值為兩個字長。但是alignof的值不會超過sizeof值,且其總是2的冪數,所以在64位上double的alignof和sizeof總是相同的。
示例:在i386和x86_64上(其它不清楚):
#pragma pack(m)
struct x
;#pragma pack()
位元組對齊不一定是按m對齊,而是按m、結構體的位元組最大成員和alignof(long)中最小的乙個對齊,而在powerpc(aix)上,則按m和結構體的位元組最大成員中的最小乙個對齊。
c++11已經支援alignof操作符,之前的版本可以使用gcc提供的巨集:__alignof__,可以在**中直接使用。
擴充套件閱讀:核心list/hlist解讀)
struct成員對齊問題
struct的成員對齊 include pragma pack 8 struct example1 short a long b struct example2 char c example1 struct1 short e pragma pack int main int argc,char ar...
struct的成員對齊問題
1 自然對界 struct 是一種復合資料型別,其構成元素既可以是基本資料型別 如int long float 等 的變數,也可以是一些復合資料型別 如array struct union 等 的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下,編譯器為結構體的每個成...
struct結構體內的對齊問題
truct結構體由於包含了不同的資料型別,而資料結構型別之間存在占用空間大小的問題,比如char型占用1位元組,short int占用2位元組,int long int 指標 float占用4位元組 double占用8位元組 windows和linux中 但計算機系統對基本資料型別可能允許位址做出了...