2012-03-28 79 views
6

我很好奇64位平臺上的uint32_t類型的對齊情況。該規範指出,uint32_t的應該是完全給出位寬,這的確好像是:uint32_t對齊64位?

> printf("sizeof(uint32_t): %zd\n", sizeof(uint32_t)); 
sizeof(uint32_t): 4 

但後來我有一個結構:

typedef struct A { 
    uint32_t a; 
    uint32_t b; 
} A; 

但是,令人驚奇:

> printf("sizeof(A): %zd\n", sizeof(A)); 
sizeof(A): 16 

由於某種原因,uint32_t是否是8字節對齊的?它真的是一個8字節的類型嗎?

+1

什麼是編譯器和什麼是體系結構? – ouah 2012-03-28 14:53:02

+1

gcc 4.4.5在x86-64上 – 2012-03-28 15:02:51

+0

請注意,由於數組的工作方式,uint32_t *的對齊要求必須小於或等於sizeof(uint32_t)'。由於'uintN_t'類型中沒有填充的要求,所以'sizeof(uint32_t)* CHAR_BIT == 32'。其他任何東西都不符合C99。但是,C99允許你的'struct A'對齊成爲任何成員的最大對齊。 – 2012-03-28 15:15:40

回答

6

它完全依賴於你的編譯器和體系結構。在你的情況下,它看起來好像字段確實是8字節對齊的,也許出於性能原因。

2

我的猜測是,默認情況下,64位體系結構上的所有內容都將與64位邊界對齊,與32位體系結構相同,所有內容都對齊到4個字節。您可以指定包裝雜注指令來擺脫填充。 例如

#pragma pack(0) 

在gcc中。

+0

奇怪的是,如果我打包(1),那麼上面的兩個元素結構的case仍然給我16,但如果我再添加一個uint32_t它,我會得到20 ...令人費解 – 2012-03-28 15:06:28