2013-02-22 12 views
5

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.

+1

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. –

+0

@DanielFischer posso tranquillizzare questo con un campo di bit fittizio? –

+0

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) –

risposta

2

-Weverything stampa tutti i messaggi di diagnostica richiesti da C così come alcune diagnosi non richieste da C. La diagnostica che viene stampata qui non è richiesta da C: il suo scopo è informativo e il tuo programma è già strettamente conforme. C afferma che un'implementazione è libera di produrre messaggi diagnostici aggiuntivi purché non riesca a tradurre il programma.

+1

Quindi qual è la motivazione per questa particolare diagnosi? Che potrei potenzialmente modificare la struttura in qualche modo in modo che se avessi array di esso non ci sarebbe un problema di prestazioni perché la struttura era disallineata nella memoria? –

+1

Per informarti che l'oggetto struttura può richiedere più byte di quanto potresti aspettarti? – ouah

+1

ok capito. Grazie. –

Problemi correlati