2011-03-29 11 views
25

sto andando anche se qualche codice C scritto per il compilatore Microchip C30 e vedo spesso le strutture definite come segue:Che cos'è una struttura "compressa" in C?

typedef struct __attribute__((__packed__)) 
{ 
    IP_ADDR  MyIPAddr;    // IP address 
    IP_ADDR  MyMask;     // Subnet mask 
    IP_ADDR  MyGateway;    // Default Gateway 
     // etc... 
} APP_CONFIG; 

Cosa significa imballato dire?

risposta

47

Quando le strutture sono definite, al compilatore è consentito aggiungere paddings (spazi senza dati effettivi) in modo che i membri cadano nei limiti dell'indirizzo che sono più facili da accedere per la CPU.

Ad esempio, in una CPU a 32 bit, i membri a 32 bit devono iniziare da indirizzi multipli di 4 byte per poter accedere in modo efficiente (lettura e scrittura). La seguente definizione della struttura aggiunge un'imbottitura 16 bit tra i due componenti, in modo che il secondo elemento cade in un indirizzo corretto confine:

struct S { 
    int16_t member1; 
    int32_t member2; 
}; 

la struttura in memoria della struttura sopra in un'architettura a 32 bit è (~ = padding):

+---------+---------+ 
| m1 |~~~~| m2 | 
+---------+---------+ 

Quando una struttura è ricco, queste imbottiture non sono inserite. Il compilatore deve generare più codice (che viene eseguito più lentamente) per estrarre i membri di dati non allineati e anche per scrivere su di essi.

La stessa struttura, quando imballato, apparirà nella memoria come qualcosa di simile a:

+---------+---------+ 
| m1 | m2 |~~~~ 
+---------+---------+ 
+0

Domanda tangenziale ma perché si dovrebbe creare una struttura impacchettata se rende le cose più lente? Riduce l'impronta della memoria? – damned

3

istruisce il compilatore di non aggiungere alcuna imbottitura tra i membri del struct.

Vedere, ad esempio, this page.

+0

Immagino tu intenda il mezzo opposto per omettere qualsiasi padding e non aggiungerlo. – flolo

+0

@flolo Ovviamente. Grazie per aver segnalato l'errore di battitura. – NPE

+0

Il link in questa risposta è rotto, c'è qualche possibilità di aggiustarlo? – Kev

1

_attribute__((__packed__)) significa (molto probabilmente) "non inserire alcuna spaziatura per rendere le cose più veloci" e può anche significare "non inserire allineamenti per conservare l'allineamento".