2012-08-02 11 views
85

E 'C language.It è scritto che:Qual è il significato di "__attribute __ ((imballato, allineate (4)))"

typedef struct __attribute__((packed, aligned(4))) Ball { 
    float2 delta; 
    float2 position; 
    //float3 color; 
    float size; 
    //int arcID; 
    //float arcStr; 
} Ball_t; 
Ball_t *balls; 

Per favore mi dica qual è il significato di esso, e come usare questa parola chiave.

+4

E 'un [ "attributo type"] (http: //gcc.gnu. org/onlinedocs/gcc/Type-Attributes.html) .. (Ho trovato questo con "C attribute packed" in Google. Sicuramente altri possono almeno fare altrettanto!) –

+1

Vedere [questa domanda] (http: // stackoverflow. it/q/8568432/827263) - sebbene con 'aligned (4)' probabilmente non hai molto di cui preoccuparti. –

risposta

102

Prima di rispondere, vorrei darvi alcuni dati da Wiki


allineamento della struttura dei dati è il modo in cui i dati sono disposti e accessibili nella memoria del computer. Consiste di due problemi distinti ma correlati: allineamento dati e riempimento della struttura dati.

Quando un computer moderno legge o scrive in un indirizzo di memoria, lo farà in blocchi di dimensioni word (ad esempio, blocchi di 4 byte su un sistema a 32 bit). L'allineamento dei dati significa mettere i dati in un offset di memoria uguale a qualche multiplo della dimensione della parola, il che aumenta le prestazioni del sistema a causa del modo in cui la CPU gestisce la memoria.

per allineare i dati, può essere necessario inserire alcuni byte insignificanti tra la fine dell'ultima struttura di dati e l'inizio del successivo, che è dati struttura imbottitura.


gcc offre la possibilità di evitare il riempimento della struttura. Per evitare questo byte senza senso in alcuni casi. Si consideri la seguente struttura

typedef struct 
{ 
    char Data1; 
    int Data2; 
    unsigned short Data3; 
    char Data4; 

}sSampleStruct; 

sizeof(sSampleStruct) sarà 12 anziché 8. A causa della struttura imbottitura. Per impostazione predefinita, in X86, le strutture verranno riempite con un allineamento di 4 byte.

typedef struct 
{ 
    char Data1; 
    //3-Bytes Added here. 
    int Data2; 
    unsigned short Data3; 
    char Data4; 
    //1-byte Added here. 

}sSampleStruct; 

Possiamo usare __attribute__((packed, aligned(X))) insistere particolare (X) padding dimensioni. X dovrebbe essere un potere di due.Consultare here

typedef struct 
{ 
    char Data1; 
    int Data2; 
    unsigned short Data3; 
    char Data4; 

}__attribute__((packed, aligned(1))) sSampleStruct; 

così l'attributo gcc sopra specificato non consente l'imbottitura struttura. quindi la dimensione sarà di 8 byte.

Se si desidera fare lo stesso per tutte le strutture, semplicemente siamo in grado di spingere il valore di allineamento di impilare utilizzando #pragma

#pragma pack(push, 1) 

//Structure 1 
...... 

//Structure 2 
...... 

#pragma pack(pop) 
+5

Se la memoria memorizza i dati in blocchi di 4 byte, allora perché non aggiunge 2 byte di riempimento al cortocircuito senza segno (la sua lunghezza di 2 byte)? o il compilatore aggiunge solo i byte di riempimento al primo e all'ultimo membro della struttura? puoi per favore chiarirlo – User

+3

@User Plz fa riferimento anche a questo. Se non hai ancora chiaro, vieni a chiedere aiuto http://stackoverflow.com/questions/11772553/why-padding-is-not-happening-in-this-case – Jeyaram

58
  • packed significa che utilizzerà il minor spazio possibile per struct Ball - vale a dire che si stipare i campi insieme senza imbottitura
  • aligned significa che ogni struct Ball inizierà su un limite di 4 byte - ovvero per qualsiasi struct Ball, il relativo indirizzo può essere diviso per 4

Queste sono estensioni GCC, non fanno parte di alcuno standard C.

8

L'attributo packed significa che il compilatore non aggiungerà padding tra i campi di struct. Il riempimento viene solitamente utilizzato per rendere i campi allineati alle loro dimensioni naturali, poiché alcune architetture impongono sanzioni per l'accesso non allineato o non lo consentono affatto.

aligned(4) significa che lo struct dovrebbe essere allineato a un indirizzo che è divisibile per 4.