У меня проблемы с -Wpadded с использованием C11 и structs._Alignas для членов структуры, использующих clang & C11
Я уже читал Structure member alignment with _Alignas, и я заглянул в документы clang и увидел, что он поддерживается сейчас.
Кроме того, я использую совершенно новую версию clang, которую я недавно создал из туловища.
$ 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 на портативном стандартном стандарте, чтобы предупреждение больше не испускалось.
Предупреждение сообщает вам, что в структуру добавлено четыре байта дополнения, чтобы элемент 'void *' был правильно выровнен в массиве (так, чтобы размер структуры был кратным «void *») s). Сообщая компилятору, что член 'int' должен быть выровнен как' void * ', не меняет его, есть еще четыре байта заполнения. –
@ DanielFischer могу ли я успокоить это с помощью фиктивного битового поля? –
Я был бы очень удивлен, если бы не смог. Если вы добавите поле 'int dummy: 26;' или около того, естественным размером будет '8 + 4 + 4' байт. (На типичной 64-битной платформе с 32-битным 'int') –