У меня возникли проблемы с -Wpadded с использованием C11 и структур.
Я уже прочитал Выравнивание элементов структуры с помощью _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*
). Сообщение компилятору о том, что членint
должен быть выровнен какvoid*
, не меняет этого, по-прежнему требуется четыре байта заполнения. - person Daniel Fischer   schedule 22.02.2013int dummy:26;
или около того, естественный размер будет8 + 4 + 4
байт. (На типичной 64-битной платформе с 32-битнымиint
s) - person Daniel Fischer   schedule 22.02.2013void*
, используя только препроцессор. Вы можете сделать это массивомstruct foo { void* a; int b[(sizeof(void*) + sizeof(int) - 1) / sizeof(int)]; };
и использовать толькоb[0]
, но это тоже некрасиво. - person Daniel Fischer   schedule 22.02.2013