2016-07-24 15 views
0

Ich versuche zu verstehen, wie Strukturen ausgerichtet sind. Nach this source, würde ich die Struktur erwartetC-Struktur-Ausrichtung

#include<inttypes.h> 
#include<stdio.h> 

typedef struct { 
    uint16_t a; 
    uint16_t b; 
    uint32_t c; 
} test_struct; 

int main (int argc, char const *argv[]) 
{ 
    printf("%lu\n", sizeof(test_struct)); 
    return 0; 
} 

eine Größe von 12 Bytes zu haben. Es dauert nur 8 Bytes in meinem Beispiel. Da es eine 32-Bit-Ganzzahl enthält, dachte ich, dass es auf 4 Bytes ausgerichtet sein sollte, das ist offensichtlich nicht der Fall.

Nachdem ich mich umgesehen habe, fand ich diese this answer, die vorschlägt, als nur die Mitglieder selbst ausgerichtet werden müssen.

Dies erklärt vollständig die Größe meiner Struktur, aber wie sieht dies mit meiner ersten Quelle aus, die behauptet, "eine Strukturinstanz wird die Ausrichtung ihres breitesten Skalarelements haben"? Ist das falsch oder fehlt mir etwas?

+5

Die beiden ' uint16_t' Typen sind gut ausgerichtet und belegen 4 Bytes; das 'uint32_t' ist auf 4 Bytes ausgerichtet; die Summe sollte und ist 8 Bytes. Jeder Typ muss gegenüber dem Start unter Verwendung seiner eigenen geeigneten Ausrichtung ausgerichtet werden. –

+0

Wenn Sie die Reihenfolge der Structure in 'a, c, b' geändert hätten, würden Sie 12 erhalten, da 2 Bytes padding/alignment zwischen' a' und 'c' benötigt würden, um' c' zu berücksichtigen für 4-Byte-Ausrichtung. –

+1

Die Struktur ist auf 4 Bytes ausgerichtet. Warum denkst du, ist es nicht? – melpomene

Antwort

2

Ihre beiden Quellen sind korrekt.

typedef struct { 
uint16_t a; // 2 bytes 
uint16_t b; // 2 bytes 
uint32_t c; // 4 bytes 
} test_struct; 

Die Gesamtgröße der Struktur beträgt 8 Bytes. Um zu ermitteln, ob eine Auffüllung erforderlich ist, untersuchen wir das breiteste Skalarelement (4 Byte) und prüfen, ob die Anzahl durch die Gesamtgröße ohne Auffüllung teilbar ist.

8 % 4 == 0

So brauchen wir nicht Polsterung.

Wenn wir hatten:

typedef struct { 
uint16_t a; // 2 bytes 
uint16_t b; // 2 bytes 
uint32_t c; // 4 bytes 
uint16_t d; // 2 bytes 
} test_struct; 

Gesamtgröße: 10 Byte

12 % 4 == 2

Padding erforderlich: 2 Byte

Tatsächliche Gesamtgröße: 12 Byte