2013-02-22 56 views
5

結構成員,我有一些麻煩,使用C11和結構-Wpadded。_Alignas使用鐺&C11

我已經讀過Structure member alignment with _Alignas,我看着在鐺文檔,發現它現在支持。

而且,我使用,我從後備箱內置近日鐺的一個很新的版本。

$ clang --version 
clang version 3.3 (trunk 175473) 
Target: x86_64-unknown-linux-gnu 
Thread model: posix 

我遇到的問題是這樣的:

#include <stdlib.h> 
#include <stdalign.h> 

struct foo{ 
    void* a; 
    int b; 
}; 

int main() { 
    struct foo instance; 

    instance.a = NULL; 
    instance.b = 2; 

    return 0; 
} 

會拋出我這樣的警告:

$ clang -Weverything -std=c11 t.c 
t.c:4:8: warning: padding size of 'struct foo' with 4 bytes to alignment boundary [-Wpadded] 
struct foo{ 
    ^
1 warning generated. 

現在不是什麼_Alignas是?我試圖把它放在int成員聲明之前,像這樣:

struct foo{ 
    void* a; 
    _Alignas(void*) int b; 
}; 

但是仍然存在相同的警告。我也嘗試將_Alignas放在不同的地方,但無濟於事。我在這裏錯過了什麼?

我知道我可以不理會這個特別的警告,我明白爲什麼填充是非常重要的,所以我沒有興趣的解決辦法或約是什麼填充的解釋。我想知道如何以便攜式,標準符合性的方式來改變我的C,這樣警告就不再發出。

+1

警告告訴您有四個字節添加到該結構以具有'空隙*'構件以陣列(正確地對準填充的,使得該結構的大小是的'無效*'」的倍數對準要求)。告訴編譯器「int」成員應該對齊爲「void *」不會改變這一點,但仍然需要四個字節的填充。 – 2013-02-22 18:54:03

+0

@DanielFischer我可以用一個虛擬的位域來安靜嗎? – 2013-02-22 19:01:53

+0

如果你不能,我會非常驚訝。如果你添加一個字段'int dummy:26;',那麼自然大小就是'8 + 4 + 4'字節。 (在32位'int'的典型64位平臺上) – 2013-02-22 19:05:30

回答

2

-Weverything打印用C,以及不被C.是這裏打印的診斷需要進行一些診斷所需的診斷消息不要求C:其目的是豐富和你的程序已經嚴格符合。 C說實現可以自由地產生額外的診斷信息,只要它不翻譯程序。

+1

那麼這個特定診斷的動機是什麼?我可以以某種方式改變結構,如果我有它的數組,那麼不會有性能問題,因爲結構在內存中沒有對齊? – 2013-02-22 19:09:55

+1

要通知您結構對象可能需要比您預期更多的字節? – ouah 2013-02-22 19:19:24

+1

沒問題。謝謝。 – 2013-02-22 19:26:30