天天看點

struct對齊問題

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

{

    int64_t a;

    int32_t c;

    int64_t b;

};

#pragma pack()

位元組對齊不一定是按M對齊,而是按M、結構體的位元組最大成員和alignof(long)中最小的一個對齊,而在powerpc(AIX)上,則按M和結構體的位元組最大成員中的最小一個對齊。

C++11已經支援alignof操作符,之前的版本可以使用GCC提供的宏:__alignof__,可以在代碼中直接使用。

繼續閱讀