Speicherlayout für verschachtelte Struktur in c

8

Ich verstehe das Konzept der Struktur in C. Ich verstehe auch, wie die Struktur im Speicher gespeichert wird. Also habe ich folgendes erstellt:

%Vor%

Die Größe der Struktur beträgt 8 Bytes (in gcc).

Beispiel für ein Speicherlayout.

%Vor%

Jetzt habe ich einige Zweifel in diesem Beispielprogramm. Wie die verschachtelte Struktur im Speicher gespeichert wird.

%Vor%     
sakthi 16.03.2016, 13:39
quelle

3 Antworten

6

Wie in Kommentaren erwähnt, ist das genaue Layout einer Struktur im Speicher implementierungsspezifisch. Im Allgemeinen stimmt auch, dass das Layout von Member-Typen, Speicheradressierung (32-Bit oder 64-Bit) und pragma pack -Anrufen beeinflusst wird, die die Art anpassen, wie die Ausrichtung entlang Speichergrenzen auftritt.

Ein Beispiel für von dem, was ich auf meinem System sehe, wenn ich zwei Instanzen der ursprünglichen Struktur als Substrukturelemente in eine andere Struktur (für context und erzwinge zusammenhängende Speicherzuweisung), dann werden einer Instanz dieser Struktur Werte zugewiesen, um im Speicherlayout unterscheidbaren Inhalt (ungleich Null) bereitzustellen:
(32-Bit-Adressierung, ohne Pragma-Anweisungen)

%Vor%

Im Hauptteil:

%Vor%

Speicher für struct S in der ersten Zeile des Bildes:

Beachten Sie, dass keine zusätzliche Speicherbelegung erforderlich ist, direkt aufgrund der Struct- oder sogar Sub-Struct-Konstrukte. Aber indirekt kann (und wird es auch sein) zusätzlicher Speicher für Ausrichtungspolster . Dies tritt auf, wenn Datentypen, die in der Strukturdefinition enthalten sind, unterschiedliche Größen haben und nicht entlang der Adressierungsgrenzen ausgerichtet sind. Wenn dies auftritt, bewirkt das Auffüllen , dass die berechnete sizeof a struct .

wirksam wird

Sie können sehen, dass die Größe jeder Instanz Ihrer ursprünglichen Struktur 8 ist (16 für zwei Instanzen) und da int und long beide perfekt ausgerichtet sind (und die gleiche Größe haben), erscheint in dieser Instanz keine Polsterung sein. Wenn long durch long long ersetzt würde, wäre dies nicht länger der Fall. Eine Polsterung wäre fast sicher erforderlich.

Um einen Kontext für die folgenden Informationen bereitzustellen, sind die relevanten Datengrößen auf meinem Computer (kompiliert für 32-Bit):

%Vor%

Es gibt mehr sichtbare Beweise für das Auffüllen und die Auswirkungen von Pragma mit einer größeren Anzahl von Typen. Die folgende Struktur enthält 4 Datentypen:

%Vor%

Bei Verwendung dieser Strukturdefinition ist es interessant, den Unterschied in der Auffüllung zu sehen, die durch die Verwendung von pragma pack -Aufrufen verursacht wird. Auf meinem Rechner und kompilieren für 32-Bit-Speicher-Mapping, hier ist, was ich sehe:

Übrigens gibt es eine Diskussion hier , die verwandte Punkte in diesem Thema behandelt.

    
ryyker 16.03.2016 14:35
quelle
2

Wie die verschachtelte Struktur im Speicher gespeichert wird?

%Vor%

Zuerst müssen Sie die Maschinenwortgröße (d. h. entweder 32-Bit / 64-Bit) & amp; auf dem gcc-Compiler installiert ist. Abhängig von den Architekturen variiert die Speicherzuordnung der Variablen. Der sizeof -Operator gibt die Größe der Variablen systemspezifisch zurück.

Zum Beispiel (mit Padding) Variablen im Speicher gespeichert

in 32-Bit-Maschinen int & amp; lang vergeben beide 4 Bytes.

| var2.var1.b | == & gt; 0x601058

| var2.a | == & gt; 0x601054

in 64-Bit-Maschinen int weist 4 Bytes & amp; long weist 8 Bytes zu.

| var2.var1.b | == & gt; 0x601058

| var2.a | == & gt; 0x601050

Speicherausrichtung von Strukturelementen wird hier erklärt Ausrichtung in c

    
Kumar2080 16.03.2016 19:30
quelle
0

Um herauszufinden, wie die verschachtelte Struktur im Speicher gespeichert ist, können Sie den folgenden Code ausführen:

%Vor%

Ich bitte Sie, diesen Code auf Ihrer Implementierung auszuführen, anstatt Ihnen eine direkte Antwort zu geben, denn:

  1. sizeof T ist implementierungsdefiniert. Was ist, wenn Sie sizeof (long) == 1 und CHAR_BIT == 32 ?
  2. haben?
  3. Es könnte Padding-Bits / Bytes in einer Struktur geben.
  4. Andere Faktoren. Zum Beispiel die Verwendung von #pragma pack(n)

Bei meiner Implementierung (unter OS X klingeln) lautet die Ausgabe:

%Vor%

Nun, es sieht hier nicht gut aus, aber es ist schön formatiert, wenn es auf meinem Bildschirm erscheint.

Also (für meine Implementierung) wird das Speicherlayout von struct tag1 wie folgt aussehen:

%Vor%     
Sun Qingyao 18.03.2016 16:47
quelle

Tags und Links