Qual è il significato di "__attribute __ ((imballato, allineato (4)))"


122

È il linguaggio C. È scritto che:

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 dimmi qual è il significato e come usare questa parola chiave.


4
È un "attributo di tipo" .. (L'ho trovato con "attributo C impacchettato" in Google. Sicuramente altri possono almeno fare altrettanto bene!)

1
Vedi questa domanda , anche aligned(4)se probabilmente non hai molto di cui preoccuparti.
Keith Thompson

Risposte:


157

Prima di rispondere, vorrei darti alcuni dati da Wiki


L'allineamento della struttura dei dati è il modo in cui i dati vengono organizzati e accessibili nella memoria del computer. Consiste di due questioni separate ma correlate: allineamento dei dati e riempimento della struttura dei dati .

Quando un computer moderno legge o scrive su un indirizzo di memoria, lo farà in blocchi di dimensioni di parola (ad esempio, blocchi di 4 byte su un sistema a 32 bit). L'allineamento dei dati significa mettere i dati a un offset di memoria uguale a un 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, potrebbe essere necessario inserire alcuni byte privi di significato tra la fine dell'ultima struttura dati e l'inizio della successiva, che è il riempimento della struttura dati .


gcc fornisce funzionalità per disabilitare il riempimento della struttura. cioè per evitare questi byte senza senso in alcuni casi. Considera la seguente struttura:

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

}sSampleStruct;

sizeof(sSampleStruct)sarà 12 anziché 8. A causa dell'imbottitura della struttura. Per impostazione predefinita, in X86, le strutture verranno riempite con un allineamento a 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)))per insistere su una particolare imbottitura (X). X dovrebbe essere potenze di due. Fare riferimento qui

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

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

quindi l'attributo gcc sopra specificato non consente il riempimento della struttura. quindi la dimensione sarà di 8 byte.

Se desideri fare lo stesso per tutte le strutture, possiamo semplicemente spingere il valore di allineamento su stack utilizzando #pragma

#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)

6
Se la memoria memorizza i dati in blocchi di 4 byte, perché non aggiunge 2 byte di riempimento al corto senza segno (i suoi 2 byte di lunghezza)? o il compilatore aggiunge semplicemente i byte di riempimento al primo e all'ultimo membro della struttura? puoi per favore chiarirlo.
Utente

5
@User Plz fa riferimento anche a questo. Se non è ancora chiaro, plz venire per aiuto stackoverflow.com/questions/11772553/...
Jeyaram

Chiunque abbia detto che questi byte di riempimento sono privi di significato non sa che l'accesso ai dati disallineato è una stranezza dell'architettura x86. Questi byte sono necessari per evitare eccezioni quando il processore tenta di caricare - diciamo un intero - dati che si trovano a cavallo del suo limite di allineamento naturale.
Tanveer Badar

86
  • packedsignifica che userà lo spazio più piccolo possibile per struct Ball- cioè riempirà i campi insieme senza riempimento
  • alignedsignifica che ciascuno struct Ballinizierà con un limite di 4 byte, ovvero per ogni il struct Ballsuo indirizzo può essere diviso per 4

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


17

L'attributo packedsignifica che il compilatore non aggiungerà il riempimento tra i campi del file struct. Il riempimento viene solitamente utilizzato per rendere i campi allineati alla loro dimensione naturale, perché alcune architetture impongono sanzioni per l'accesso non allineato o non lo consentono affatto.

aligned(4) significa che la struttura deve essere allineata a un indirizzo divisibile per 4.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.