Wie werden die struct-members reserviert im Speicher?
Während Sie versuchen, zu erstellen eine Speicher-manager für die Zukunft von C-Programmen habe ich über diese Frage:
"wenn Strukturen zugeordnet sind, deren Mitglied Feldern gespeichert werden in der angegebenen Reihenfolge?"
Betrachten Sie beispielsweise die folgende Struktur.
typedef struct {
int field1;
int field2;
char field3;
} SomeType;
Wenn zugewiesen, werden die Speicher-Adressen der Felder werden in der Reihenfolge Feld1, Feld2, feld3? Oder ist das nicht garantiert?
- Sollten Sie gesucht haben, mit der exakt gleichen Frage-string-ersten. Hier ist was ich gefunden habe: stackoverflow.com/questions/2748995/c-struct-memory-layout
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort: Sie zugewiesen sind, mit der Reihenfolge wie Sie deklariert den struct.
Beispiel:
Ausgabe:
Die bildliche Darstellung der oben beschriebenen Struktur wird der Speicher unten gegeben. Dieses Diagramm wird Ihnen helfen, zu verstehen, die memory allocation Konzept in C sehr leicht.
Weiter Lesen: check-out hier (auch die Quelle für das obige Beispiel) für
C – Structure Padding
undStructure dynamic memory allocation in C
.Werden Sie garantiert, dass
field3
kommt nachfield2
kommt, die nachfield1
, und dassfield1
ist am Anfang des Speichers (d.h. es gibt keine Polsterung vorfield1
). Sie können jedoch auch Polsterung zwischen den anderen Mitgliedern (und auch nachfield3
). Kurz gesagt, die Reihenfolge, in der Sie deklariert sind, ist die Reihenfolge, in der Sie im Speicher angeordnet sind, obwohl eine exakte Ausrichtung und Polsterung wird durch die Implementierung definiert (aber es werden keine Auffüllung vor dem ersten Element).SomeType x; ((void*) &x) == ((void*) &x.field1)
.field1
undfield2
kann man sagen, dass die Polsterung ist nachfield1
oder Sie können sich alternativ auch sagen, es ist die Polsterung, vorfield2
. Weder die Aussage ist falsch; es kommt nur auf die Perspektive an. Aber wenn ich deine Frage falsch interpretiert, und Sie wurden stattdessen Fragen, warum es möglicherweise keine Polsterung überhaupt, dann ist die Antwort alles über die Angleichung der Dinge, die in Speicher mit den Prozessoren native alignment-Anforderungen.int
ist ausgerichtet auf 4-byte-Grenzen (wennint
4 bytes), währendchar
hat keine solche Einschränkung (es ist als 1-byte-Ausrichtung, so kann überall im Speicher). Wenn Sie eineint
nach einemchar
, 3 bytes Polsterung erforderlich sind, um sicherzustellen, dass dieint
Linien bis auf eine Speicher-Adresse, die ist teilbar durch 4.Beispiel:
Den struct ' s Erster Standort ist x:
Feld1 Länge 1(byte), filed2 4, field3 ist 8
also Feld1 x+0, Feld2 x+4 bis x+7, field3 ist bei x+8 bis x+15 und x+1~x+3 ist gepolstert, um field2 am richtigen Ort.
Und die ganze Struktur ist Länge teilen genau von seinem größten Mitglied; wenn nicht, Auffüllen, einige bytes zu Ende.