Sie Klasse / Struktur Mitglieder immer erhalten erstellt sie im Speicher in der Reihenfolge deklariert wurden?

StackOverflow https://stackoverflow.com/questions/281045

  •  07-07-2019
  •  | 
  •  

Frage

Dies ist eine Frage, die von Rob Walker 's Antwort here .

Angenommen, ich eine Klasse / Struktur erklären, wie so:

struct
{ 
    char A;
    int B;
    char C;
    int D;
};

Ist es sicher anzunehmen, dass diese Elemente in dieser Reihenfolge im Speicher genau erklärt werden, oder ist dies ein Compiler abhängig, was? Ich frage, weil ich immer, dass der Compiler kann angenommen hatte tun, was es mit ihnen will.

Das führt zu meiner nächsten Frage. Wenn das obige Beispiel Speicherausrichtungsprobleme verursacht, warum kann der Compiler nicht nur, dass wiederum in so etwas wie implizit:

struct
{ 
    char A;
    char C;
    int B;
    int D;
};

(Ich frage in erster Linie über C ++, aber ich würde mich interessieren, wie auch die C-Antwort zu hören)

Verwandte Themen

War es hilfreich?

Lösung

C99 §6.7.2.1 Klausel 13 Staaten:

  

Innerhalb eines Strukturobjekt, das   Nicht-bit- Feldelemente und die Einheiten in   die bitweisen Felder residieren Adressen haben   Diese Erhöhung in der Reihenfolge, in der   sie deklariert sind.

und geht auf etwas zu sagen, mehr über Polsterung und Adressen. Der C89 äquivalente Abschnitt ist §6.5.2.1.

C ++ ist ein bisschen komplizierter. In den Jahren 1998 und 2003 Normen gibt es §9.2 Klausel 12 (Abschnitt 15 in C ++ 11):

  

nicht-statische Datenelemente eines   (Non-union) Klasse ohne eine erklärt   intervenierenden zugriffs Spezifizierer sind   zugeordnet, so dass später Mitglieder   höhere Adressen innerhalb einer Klasse   Objekt. Die Reihenfolge der Zuteilung von   nicht statische Datenelemente durch eine getrennte   access-Spezifizierer ist nicht spezifiziert   (11.1). Die Umsetzung Ausrichtung   Anforderungen könnten zwei benachbarten verursachen   Mitglieder nicht zugeteilt werden   unmittelbar nach einander; so könnte   Anforderungen an Raum für die Verwaltung   virtuelle Funktionen (10.3) und virtuelle   Basisklassen (10.1).

Andere Tipps

Die Datenelemente werden in der Reihenfolge erklärt angeordnet. Der Compiler ist frei padding einzustreuen die Speicherausrichtung arrangieren es mag (und Sie werden feststellen, dass viele Compiler eine boatload eine Ausrichtung Spezifikation Optionen --- sinnvoll, wenn durch verschiedene Programme zusammengestellt Bits zu mischen.).

Siehe auch Warum funktioniert GCC optimize structs? .


Es scheint, dass diese Antwort etwas veraltet für C ++. Sie lernen jeden Tag etwas. Dank aib, Nemanja.

Grundsätzlich kann man sich verlassen, dass nur für die Klassen mit einem Standardlayout . Streng genommen Standardlayout ist eine C ++ 0x Sache, aber es ist wirklich nur die Standardisierung bestehende Praxis /

Ich kann nicht sprechen für C ++, aber in C ist die Reihenfolge garantiert die gleiche Reihenfolge im Speicher sein, wie in der Struktur deklariert.

Neben Polsterung für die Ausrichtung ist keine Strukturoptimierung von jedem Compiler erlaubt (das ist mir bewusst) für C oder C ++. Ich kann für C ++ Klassen nicht sprechen, da sie völlig ein anderes Tier sein können.

Betrachten Sie Ihr Programm mit System / Library-Code auf Windows-Schnittstelle, aber Sie wollen GCC verwenden. Sie müßten sicherstellen, dass GCC einen identischen Layout-Optimierungsalgorithmus verwendet, so dass alle Ihre Strukturen korrekt verpackt würden, bevor sie an den MS-kompilierten Code zu senden.

Während die verwandten Themen auf der rechten Seite surfen, ich sah auf diese Frage . Ich stelle dar, kann dies eine interessante Ecke Fall sein, wenn über diese Themen denken (es sei denn, es häufiger ist, als ich erkennen).

paraphrasieren, wenn Sie eine Struktur in C haben, die etwa wie folgt aussieht:

struct foo{};

und Unterklasse es wie so in C ++ (eine separate Übersetzungseinheit verwendet wird):

extern "C" foo;
struct bar: public foo{};

Dann wird der Speicherausrichtung nicht unbedingt das gleiche für die Gründe aib (auch unter Compiler vom gleichen Hersteller) erwähnt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top