Wie werden Strukturmitglieder im Speicher zugewiesen?
Lesezeit: 4 Minuten
Douglas Adam Smith II
Beim Versuch, einen Speichermanager für zukünftige C-Programme zu erstellen, bin ich auf diese Frage gestoßen:
“Wenn Strukturen zugewiesen werden, werden ihre Mitgliedsfelder in der angegebenen Reihenfolge gespeichert?”
Betrachten Sie beispielsweise die folgende Struktur.
typedef struct {
int field1;
int field2;
char field3;
} SomeType;
Werden die Speicheradressen der Felder bei der Zuordnung in der Reihenfolge Feld1, Feld2, Feld3 sein? Oder ist das nicht gewährleistet?
Sie sollten zuerst mit genau derselben Fragezeichenfolge gesucht haben. Folgendes habe ich gefunden: stackoverflow.com/questions/2748995/c-struct-memory-layout
– Hariprasad
23. Dezember 2013 um 4:57 Uhr
herohuyongtao
Kurze Antwort: Sie werden mit der Reihenfolge zugewiesen, wie sie in der Struktur angegeben sind.
Beispiel:
#include <stdio.h>
#include <string.h>
struct student
{
int id1;
int id2;
char a;
char b;
float percentage;
};
int main()
{
int i;
struct student record1 = {1, 2, 'A', 'B', 90.5};
printf("size of structure in bytes : %d\n",
sizeof(record1));
printf("\nAddress of id1 = %u", &record1.id1 );
printf("\nAddress of id2 = %u", &record1.id2 );
printf("\nAddress of a = %u", &record1.a );
printf("\nAddress of b = %u", &record1.b );
printf("\nAddress of percentage = %u",&record1.percentage);
return 0;
}
Ausgabe:
size of structure in bytes : 16
Address of id1 = 675376768
Address of id2 = 675376772
Address of a = 675376776
Address of b = 675376777
Address of percentage = 675376780
Die bildliche Darstellung der Speicherzuordnung der obigen Struktur ist unten angegeben. Dieses Diagramm wird Ihnen helfen, das Speicherzuweisungskonzept in C sehr leicht zu verstehen.
Weiterlesen: Kasse hier (auch die Quelle für das obige Beispiel) für C – Structure Padding und Structure dynamic memory allocation in C.
Das ist Ihnen garantiert field3 Kommt danach field2was danach kommt field1und das field1 steht am Anfang des Speichers (d. h. es gibt keine Auffüllung davor field1). Sie können jedoch zwischen den anderen Mitgliedern (und sogar danach) aufgefüllt werden field3). Kurz gesagt, die Reihenfolge, in der sie deklariert werden, ist die Reihenfolge, in der sie im Speicher angeordnet sind, obwohl die genaue Ausrichtung und Auffüllung durch die Implementierung definiert ist (aber es gibt keine Auffüllung vor dem ersten Mitglied).
Genau genommen ist das garantiert SomeType x; ((void*) &x) == ((void*) &x.field1).
– orlp
23. Dezember 2013 um 4:58 Uhr
Warum würde es vor einem Mitglied auffüllen!
– Rullof
23. Dezember 2013 um 5:26 Uhr
@rullof: Das Auffüllen vor einem Mitglied ist dasselbe wie das Auffüllen nach dem vorherigen Mitglied. Wenn dazwischen Polsterung ist field1 und field2kann man sagen, dass Polsterung hinterher ist field1oder Sie können alternativ sagen, dass vorher Polsterung vorhanden ist field2. Keine Aussage ist falsch; es kommt eben auf die perspektive an. Aber wenn ich Ihre Frage falsch interpretiert habe und Sie sich stattdessen gefragt haben, warum überhaupt eine Polsterung vorhanden sein könnte, lautet die Antwort Alles über das Ausrichten von Dingen im Speicher mit den nativen Ausrichtungsanforderungen des Prozessors.
– Maisstängel
23. Dezember 2013 um 5:46 Uhr
Ich meine, warum sollte eine Polsterung zwischen den Mitgliedern sein. Was ist der Zweck davon?
– Rullof
23. Dezember 2013 um 5:48 Uhr
@rullof: Hoppla; Nun, in diesem Fall habe ich den vorherigen Kommentar geändert. Aber um ein bisschen mehr zu erweitern, x86 erfordert das int ist auf 4-Byte-Grenzen ausgerichtet (if int ist 4 Bytes), während char hat keine solche Einschränkung (es handelt sich um eine 1-Byte-Ausrichtung, kann sich also irgendwo im Speicher befinden). Wenn Sie eine haben int nach einer char3 Byte Padding werden benötigt, um sicherzustellen, dass die int auf einer durch 4 teilbaren Speicheradresse aufreiht.
– Maisstängel
23. Dezember 2013 um 5:51 Uhr
SliceSort
Die Mitglieder werden einzeln lokalisiert;
Der Startort jedes Mitglieds sollte genau durch seine Länge geteilt werden:
Sie sollten zuerst mit genau derselben Fragezeichenfolge gesucht haben. Folgendes habe ich gefunden: stackoverflow.com/questions/2748995/c-struct-memory-layout
– Hariprasad
23. Dezember 2013 um 4:57 Uhr