Wie werden Objekte gespeichert, die im Speicher in C++?
Wie werden Objekte gespeichert, die im Speicher in C++?
Für eine reguläre Klasse wie
class Object
{
public:
int i1;
int i2;
char i3;
int i4;
private:
};
Wird ein pointer-Objekt wie ein array verwendet werden kann, um Zugang i1 wie folgt?
((Object*)&myObject)[0] === i1?
Andere Fragen auf, SO scheinen nahezulegen, dass durch die Umwandlung einer Struktur zu einem Zeiger auf das erste Mitglied für POD-Typen. Wie ist diese unterschiedliche Klassen mit Konstruktoren, wenn überhaupt?
In welcher Weise unterscheidet es sich für die nicht-POD-Typen?
Edit:
In Erinnerung daher würde die obige Klasse angelegt werden, wie die folgenden?
[i1 - 4bytes][i2 - 4bytes][i3 - 1byte][padding - 3bytes][i4 - 4bytes]
Sie sind wahrscheinlich direkt über der Polsterung, solange int ist 4 Byte breit, und char 1 byte breit.
InformationsquelleAutor Dynite | 2009-01-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fast. Du wirkst auf ein Objekt*, und vernachlässigt, um eine Adresse. Mal wieder Fragen wie die folgenden:
Müssen Sie wirklich vorsichtig sein mit Annahmen wie diese. Wie hast du Sie definiert die Struktur, sollte dies wahr sein, alle compiler, die Sie wahrscheinlich stoßen. Aber alle möglichen anderen Eigenschaften des Objekts (was Sie vielleicht ausgelassen haben, von Ihrem Beispiel) werden, wie andere gesagt haben, machen Sie es nicht-POD und könnte (ggf. in einem compiler-abhängigen Weg) machen, die obige Aussage nicht wahr.
Beachten Sie, dass ich würde nicht so schnell zu sagen, dass es funktionieren würde, wenn Sie gebeten hatte, über die i3 -- in diesem Fall, selbst für nur-POD, Ausrichtung oder endianness könnte leicht Schraube, die Sie bis.
In jedem Fall sollten Sie vermeiden, diese Art der Sache, wenn möglich. Auch wenn es gut funktioniert, nun, wenn du (oder jemand anderes, die nicht verstehen, dass Sie das tun trick) immer Veränderungen der Struktur um oder fügt neue Felder, wird dieser trick nicht in allen Orten, die Sie verwendet haben, die hart sein können zu finden.
Antwort zu deinem edit: Wenn das Ihre gesamte definition der Klasse, und du bist mit einer der mainstream-Compiler mit Standard-Optionen, und auf einem Computer mit x86-Prozessor, dann ja, haben Sie wahrscheinlich erraten Sie den richtigen Speicher-layout. Aber die Wahl der compiler, compiler-Optionen, und andere CPU-Architektur könnte leicht zum erlöschen Ihrer Annahmen.
ja, ich denke, u hat gute Punkte
InformationsquelleAutor Larry Gritz
Klassen ohne virtuellen Mitglieder und ohne Vererbung im Speicher angeordnet sind wie Strukturen. Aber, wenn Sie anfangen, Ebenen der Vererbung können die Dinge schwierig werden, und es kann schwer sein, herauszufinden, in welcher Reihenfolge die Dinge sind im Speicher (vor allem mehrfache Vererbung).
Virtuellen Mitglieder, Sie haben einen "vtable" im Speicher, die enthält Zeiger auf die eigentliche Funktion, die erzeugt wird, basierend auf der Vererbungshierarchie der Klasse.
Die Quintessenz ist: nicht auf Klassen, die auf diese Weise auf alle, wenn Sie es vermeiden können (und auch nicht memset Sie oder memcpy). Wenn Sie dies tun muss (warum?) dann kümmern, dass Sie genau wissen, wie Sie Ihre class-Objekte sind im Speicher und werden vorsichtig, um zu vermeiden, Vererbung.
... In der Praxis gibt es verschiedene Arten von nicht-POD-Klasse, die die meisten Compiler legen aus, als wären Sie POD. Es ist unklug, auf diese angewiesen sind, andere als als Folge der Garantien in der Dokumentation der jeweiligen compiler.
Sind Sie sicher, dass POD-Klassen können nicht die Vererbung verwenden? Was ist, wenn Sie nur Erben aus einer POD-Typ?
InformationsquelleAutor SoapBox
Es ist Unterschied, dass dieser trick gilt nur für POD-Typen. Das ist wirklich alles dort ist zu ihm. Der standard gibt an, dass dieser cast ist gültig für ein POD-Typ, aber macht keine Garantien über das, was passiert mit nicht-POD-Typen.
InformationsquelleAutor jalf
Es hängt wirklich davon ab, der compiler, oder vielmehr, es bleibt dem compiler, um festzustellen, das Speicher-layout.
Zum Beispiel, eine Mischung von public, private und protected-member-Variablen festgelegt werden könnten, so dass jeder Zugriff Typ ist zusammenhängend. Oder, abgeleitete Klassen können member-Variablen interleaved mit ungenutzten Raum in der super-Klasse.
Dinge noch schlimmer werden mit der virtuellen Vererbung, wo die virtuell geerbte Basisklassen werden kann, layed out überall in den Speicher für die jeweilige Instanz.
POD ist anders, weil es muss kompatibel sein mit C.
InformationsquelleAutor MSN
In der Regel, was wichtig ist, ist nicht, ob die Klasse hat einen Konstruktor: was zählt, ist, ob die Klasse alle virtuellen Methoden. Für details, google für 'vtable' und 'vptr'.
InformationsquelleAutor ChrisW