2011-03-29 20 views
25

jadę chociaż jakiś kod C pisemnej dla kompilatora Microchip C30 i często widzę konstrukcjom zdefiniowane następująco:Co to jest "upakowana" struktura w C?

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

Co pakowane na myśli?

Odpowiedz

47

Po zdefiniowaniu struktur, kompilator może dodawać paddings (spacje bez rzeczywistych danych), tak aby członkowie znajdowali się w granicach adresów, które są łatwiej dostępne dla procesora.

Na przykład na 32-bitowym procesorze 32-bitowe elementy powinny rozpoczynać się od adresów o rozmiarze 4 bajtów, aby uzyskać efektywny dostęp (odczyt i zapis). W poniższej definicji struktury dodaje wyściółkę 16 bitów pomiędzy oba elementy, tak że drugi człon mieści się w odpowiedniej granicy adres:

struct S { 
    int16_t member1; 
    int32_t member2; 
}; 

Struktura pamięci powyższej strukturze, w architekturze 32-bitowe (~ = wyściółka)

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

Jeżeli struktura jest pakowany, podkładki te nie są umieszczone. Kompilator musi wygenerować więcej kodu (który działa wolniej), aby wyodrębnić niepowiązane elementy danych, a także zapisać do nich.

taką samą strukturę, gdy pełne, pojawi się w pamięci jako coś w rodzaju:

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

Pytanie styczne, ale dlaczego ktoś miałby stworzyć spakowaną strukturę, jeśli powoduje spowolnienie? Czy to ogranicza ślad pamięci? – damned

3

To instruuje kompilator nie dodawać żadnych dopełnienie między członkami struct.

Zobacz na przykład this page.

+0

Sądzę, że masz na myśli przeciwieństwo - zapakowane oznacza pominięcie jakiegokolwiek dopełnienia i nie dodawanie go. – flolo

+0

@flolo Oczywiście. Dzięki za wskazanie literówki. – NPE

+0

Link w tej odpowiedzi jest zepsuty, istnieje szansa na naprawienie? – Kev

1

_attribute__((__packed__)) oznacza (najprawdopodobniej) "nie wstawiaj wyściółki, aby przyspieszyć działanie" i może również oznaczać "nie wstawiaj żadnych linii trasowania, aby zachować wyrównanie".