Struktur eines C ++ Objekts im Speicher gegen ein Struct
Wenn ich eine Klasse wie folgt
class Example_Class
{
private:
int x;
int y;
public:
Example_Class()
{
x = 8;
y = 9;
}
~Example_Class()
{ }
};
Und eine Struktur, die wie folgt
struct
{
int x;
int y;
} example_struct;
Ist die Struktur im Speicher des example_struct
anderes in Example_Class
zum Beispiel, wenn ich den folgenden
struct example_struct foo_struct;
Example_Class foo_class = Example_Class();
memcpy(&foo_struct, &foo_class, sizeof(foo_struct));
wird foo_struct.x = 8
und foo_struct.y = 9
(sprich: die gleichen Werte wie die x -, die y-Werte in die foo_class) ?
Der Grund warum ich Frage ist, ich habe eine C++ - Bibliothek (die nicht wollen, um es zu ändern), dass "sharing" ein Objekt mit C-code und ich will eine struct zur Darstellung des Objekts aus der C++ Bibliothek. Ich bin nur daran interessiert, die Attribute des Objekts.
Ich weiß, die ideale situation wäre, haben Example_class wrap arround eine gemeinsame Struktur zwischen der C-und C++ - code, aber es wird nicht leicht sein, ändern Sie die C++ - Bibliothek im Einsatz.
InformationsquelleAutor der Frage hhafez | 2009-01-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den C++ - standard garantiert , Speicher-layouts C
struct
- und eine C++class
(oderstruct
-- gleiche) identisch sein wird, vorausgesetzt, dass die C++class
/struct
passt die Kriterien POD ("Plain Old Data"). So was tut POD bedeuten?Einer Klasse oder Struktur ist POD:
Nur über das "C++-Ismen" erlaubt sind nicht-virtuelle member-Funktionen, statische member und member-Funktionen.
Da Ihre Klasse hat sowohl einen Konstruktor und einen Destruktor, ist es formal nicht von POD-Typ, so dass die Garantie nicht hält. (Obwohl, wie andere erwähnt haben, in der Praxis die beiden layouts sind wahrscheinlich identisch auf jedem compiler, dass Sie versuchen, so lange wie es gibt keine virtuellen Funktionen).
Siehe Abschnitt [26.7] der C++ FAQ Lite für mehr details.
InformationsquelleAutor der Antwort j_random_hacker
Das Verhalten ist nicht garantiert, und es ist compiler-abhängig.
Gesagt, dass die Antwort ist "ja, auf meinem Computer", vorausgesetzt, dass die Example_Class enthält keine virtuelle Methode (und nicht Erben von einer Basisklasse).
InformationsquelleAutor der Antwort ChrisW
Im Fall, den Sie beschreiben, ist die Antwort "wahrscheinlich ja". Allerdings, wenn die Klasse muss alle virtuelle Funktionen (einschließlich virtueller Destruktor, die von einer Basisklasse geerbt wurden), oder die mehrfache Vererbung verwendet, dann wird die Klasse layout kann unterschiedlich sein.
InformationsquelleAutor der Antwort Greg Hewgill
Hinzufügen zu dem, was andere Leute gesagt haben (zB: compiler-spezifisch ist, wird wahrscheinlich funktionieren, solange Sie nicht über virtuelle Funktionen):
Ich würde sehr empfehlen eine statische assert (compile-time check) , sizeof(Example_class) == sizeof(example_struct), wenn Sie dies tun. Sehen BOOST_STATIC_ASSERT, oder der entsprechende compiler-spezifische oder benutzerdefinierte Bau. Dies ist eine gute erste Linie der Verteidigung, wenn jemand (oder etwas, wie ein compiler ändern) ändert die Klasse zu entkräften, das Spiel. Wenn Sie möchten, zusätzliche überprüfung, können Sie auch die Laufzeit überprüfen Sie, dass die offsets für die Mitglieder sind die gleichen, die (zusammen mit der statischen Größe assert) wird Gewähr für die Richtigkeit.
InformationsquelleAutor der Antwort Nick
Klassen & structs in C++ sind das äquivalent, mit der Ausnahme, dass alle Mitglieder einer struct standardmäßig public sind (die Schüler sind standardmäßig privat). Dies stellt sicher, dass das kompilieren legacy C-code in einem C++ - compiler wie erwartet funktionieren wird.
Gibt es nichts zu stoppen Sie alle die Lust auf C++ - Funktionen in ein struct:
InformationsquelleAutor der Antwort Mike Thompson
Warum nicht explizit zuweisen der Klasse haben die Mitglieder der struct ist, wenn Sie wollen, übergeben Sie die Daten auf C? So wissen Sie, dass Ihr code funktioniert überall.
InformationsquelleAutor der Antwort Chuck
In die frühen Tage von C++ - Compilern gab es die Beispiele, wenn die compiler ersten Veränderungen, die Schlüsselwörter struct mit Klassen-und dann kompiliert. So viel über die Gemeinsamkeiten.
Unterschiede von Vererbung und, vor allem, virtuelle Funktionen. Wenn die Klasse enthält virtuelle Funktionen, dann muss es einen Zeiger auf type-descriptor an den Anfang des Layouts. Auch, wenn die Klasse B erbt von Klasse A, dann Klasse A, das layout zuerst kommt, gefolgt von der Klasse B, eigenes layout.
Also die genaue Antwort auf deine Frage, nur Gießen eine Instanz der Klasse, um eine Struktur-Instanz ist: hängt davon ab, Klasse Inhalt. Für eine Besondere Klasse, die die Methoden (Konstruktor und nicht-virtuellen Destruktor), das layout ist wahrscheinlich das gleiche. Sollte der Destruktor als virtual deklariert werden, würde das layout auf jeden Fall der Unterschied zwischen Struktur und Klasse.
Hier ist ein Artikel, der zeigt, dass es nicht viel brauchte um Schritt von C Strukturen in C++ - Klassen: Lektion 1 - Von der Struktur zur Klasse
Und hier ist der Artikel, der erklärt, wie virtuelle Funktionen Tabelle wurde eingeführt, um Klassen, die virtuelle Funktionen: Lektion 4 - Polymorphismus
InformationsquelleAutor der Antwort Zoran Horvat
Du wohl nur ableiten der Klasse von der Struktur, entweder öffentlich oder privat. Dann Gießen würde es sich lösen, richtig in der C++ - code.
InformationsquelleAutor der Antwort Daemin