2012-04-12 14 views
0

Lasst uns sagen, dass ich die folgende Struktur definiert werden:Speicher Ausrichtung und Größe der Struktur

struct MyData { 
    int a; 
    char b; 
    int c; 
    byte d; 
    byte e; 
} 

Ich erinnere mich vage, zu lesen, dass die Größe dieser Struktur nicht nur auf den Datentyp abhängt, sondern auch Speicherausrichtung. Auf einer 32-Bit-CPU wäre die MyData-Struktur 4 Byte + 1 Byte + 4 Byte + 1 Byte + 1 Byte = 11 Byte. Hier ist meine Frage, ist Speicher Alignement erhöht die Größe der Struktur: 4 Bytes + 1 Byte (+3 Bytes Padding) + 4 Bytes + 1 Byte (+3 Bytes Padding) + 1 Byte (+3 Bytes Padding) = 20 Bytes.

Ist das falsch? Fehle ich etwas? Ist das etwas sprachspezifisch? Kann ich die Struktur packen? Wenn ja, was wären die Vor- und Nachteile?

Danke!

+1

Ein wenig googeln und testen mit sizeof() kann Ihnen eine Menge Informationen geben. Sie werden hier einige nützliche Dinge finden: http://c-faq.com/ – pzanoni

Antwort

0

Es gibt keine Auffüllung zwischen und nach Strukturelementen. Es gibt keine Polsterung vor dem ersten struct Mitglied, das heißt:

struct MyData bla; 

int val = (char *) &bla == (char *) &bla.a; // val is 1 

Ein Zeiger auf die Struktur (in geeigneter Weise umgewandelt) zeigt auf das erste Strukturelement.

Die Größe des Strukturobjekts berücksichtigt das Padding und ist gleich der Summe der Größe der Elemente + der Summe der Größe der nicht angegebenen Paddings.

2

Der Compiler kann die Struktur so anpassen, wie sie es für richtig hält. In der Regel werden die beiden letzten byte s nicht durch Auffüllen getrennt, sodass die Größe 4 (int) + 1 (char) + 3 (padding) + 4 (int) + 1 (byte) + 1 (byte) + 2 (padding) = 16 wird.

Viele Compiler ermöglichen das Packen der Struktur per Pragma. Der Vorteil davon ist eine geringere Speichernutzung, der Nachteil langsamer Lesen für die nicht ausgerichteten int Mitglieder.

0

Ja, Compiler richten natürlich Typen auf Grenzen ein, die ihrer Größe entsprechen. Sie können Struktur Verpackung zwingen Compiler Pragmas verwenden wie

#pragma pack(1) 

Sie auch eine gewisse Polsterung durch Neuordnen Ihre Erklärungen vermeiden können Ihre Ints am Anfang und einzelne Bytes danach zu setzen.

Sie können dies leicht testen, indem Sie den Druck sizeof(struct MyData)

1

Sie sind nicht falsch, dass die Speicherausrichtung in unter Angabe der Größe der Struktur erhöhen; Allerdings sind Annahmen, wie der Speicher ausgerichtet wird, nicht für alle Plattformen gültig. Dies ist streng plattformspezifisch. Grundsätzlich

meisten Plattformen neigen dazu, auf $ auszurichten {Wortgröße}, oder wenn der Datentyp kleiner als $ {Wortgröße}, dann richtet es auf die nächste verfügbare Fraktion von $ {Wortgröße}

Zum Beispiel Wenn Sie ein 32-Bit-Wort haben und 16-Bit-Kurzschlüsse speichern, können sie sich auf die Bits 0 und 16 innerhalb eines Wortes ausrichten. Aber das ist keine Garantie, da es wirklich plattformspezifisch ist.

Um Ihre Strukturen auf Grund von Auffüllung für kleinere Verschwendung zu optimieren, ordnen Sie die Elemente nach Datentyp mit den größeren Datentypen zuerst. Dies ermöglicht es, mehrere Bytes in ein und dasselbe Wort zu packen (wenn möglich), und die Wörter, die größer als ein Wort sind, enden gut an Wortgrenzen, da sie zu sauberen Vielfachen eines Worts gehören (Quadwort, Doppelwort, ...).)

Verwandte Themen