結構成員,我有一些麻煩,使用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,這樣警告就不再發出。
警告告訴您有四個字節添加到該結構以具有'空隙*'構件以陣列(正確地對準填充的,使得該結構的大小是的'無效*'」的倍數對準要求)。告訴編譯器「int」成員應該對齊爲「void *」不會改變這一點,但仍然需要四個字節的填充。 – 2013-02-22 18:54:03
@DanielFischer我可以用一個虛擬的位域來安靜嗎? – 2013-02-22 19:01:53
如果你不能,我會非常驚訝。如果你添加一個字段'int dummy:26;',那麼自然大小就是'8 + 4 + 4'字節。 (在32位'int'的典型64位平臺上) – 2013-02-22 19:05:30