2013-02-22 7 views
5

У меня проблемы с -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 на портативном стандартном стандарте, чтобы предупреждение больше не испускалось.

+1

Предупреждение сообщает вам, что в структуру добавлено четыре байта дополнения, чтобы элемент 'void *' был правильно выровнен в массиве (так, чтобы размер структуры был кратным «void *») s). Сообщая компилятору, что член 'int' должен быть выровнен как' void * ', не меняет его, есть еще четыре байта заполнения. –

+0

@ DanielFischer могу ли я успокоить это с помощью фиктивного битового поля? –

+0

Я был бы очень удивлен, если бы не смог. Если вы добавите поле 'int dummy: 26;' или около того, естественным размером будет '8 + 4 + 4' байт. (На типичной 64-битной платформе с 32-битным 'int') –

ответ

2

-Weverything распечатывает все диагностические сообщения, требуемые C, а также некоторые диагностические данные, не требуемые C. Диагностика, напечатанная здесь, не требуется C: ее цель информативна, и ваша программа уже строго соответствует. C говорит, что реализация бесплатна для создания дополнительных диагностических сообщений, если она не переводит программу.

+1

Итак, какова мотивация этой конкретной диагностики? Я мог бы каким-то образом изменить структуру так, чтобы, если бы у меня были массивы, не было бы проблем с производительностью, потому что структура была смещена в памяти? –

+1

Чтобы сообщить вам, что объект структуры может занимать больше байтов, чем можно было бы ожидать? – ouah

+1

ОК получил. Благодарю. –