Sie Klasse / Struktur Mitglieder immer erhalten erstellt sie im Speicher in der Reihenfolge deklariert wurden?
-
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
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.