Ho qualche problema con -Wpadded usando C11 e structs._Alignas per membri della struct che usano clang & C11
Ho già letto Structure member alignment with _Alignas e ho cercato nei documenti clang e ho visto che ora è supportato.
Inoltre, sto usando una versione molto nuova di clang che ho creato recentemente dal trunk.
$ clang --version
clang version 3.3 (trunk 175473)
Target: x86_64-unknown-linux-gnu
Thread model: posix
Il problema che sto funzionando in è questo:
#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;
}
Il che mi lancia questo avvertimento:
$ 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.
Ora, non è questo ciò che _Alignas
è per? Ho provato a metterlo prima della dichiarazione membro int, in questo modo:
struct foo{
void* a;
_Alignas(void*) int b;
};
Ma lo stesso avviso rimane. Ho anche provato a mettere gli Alignas in vari posti, senza risultato. Cosa mi manca qui?
So che potrei semplicemente ignorare questo avviso particolare e capisco perché il padding è importante, quindi non sono interessato a soluzioni alternative o spiegazioni su cosa sia il padding. Voglio sapere come cambiare la mia C in un modo conforme agli standard, in modo che l'avviso non venga più emesso.
L'avviso indica che c'erano quattro byte di padding aggiunti alla struttura in modo che il membro 'void *' fosse allineato correttamente in una matrice (in modo che la dimensione della struttura fosse un multiplo di 'void *' ' s requisito di allineamento). Dicendo al compilatore che il membro 'int' dovrebbe essere allineato come' void * 'non cambia questo, ci sono ancora quattro byte di padding necessari. –
@DanielFischer posso tranquillizzare questo con un campo di bit fittizio? –
Sarei estremamente sorpreso se non potessi. Se aggiungi un campo 'int dummy: 26;' o così, la dimensione naturale sarebbe '8 + 4 + 4' byte. (Sulla tipica piattaforma a 64 bit con 'int's a 32 bit) –