Ich nehme eine wilde Vermutung an:
C ++ - Konstruktor und Destruktor sind überhaupt keine Funktionen, sondern Makros. Sie werden in den Bereich eingefügt, in dem das Objekt erstellt wird, und in den Bereich, in dem das Objekt zerstört wird. Es gibt wiederum keinen Konstruktor oder Destruktor, das Objekt ist nur IS.
Tatsächlich denke ich, dass die anderen Funktionen in der Klasse keine Funktionen sind, sondern Inline-Funktionen, die NICHT inline gesetzt werden, weil Sie die Adresse von ihnen übernehmen (der Compiler erkennt, dass Sie darauf zugreifen und den Code nicht in die Funktion und inline setzen optimiert diese Funktion) und wiederum scheint die Funktion "immer noch da" zu sein, obwohl dies nicht der Fall wäre, wenn Sie die Adresse nicht angegeben hätten.
Die virtuelle Tabelle des C ++ - "Objekts" ist nicht wie ein JavaScript-Objekt, über das Sie den Konstruktor abrufen und Objekte daraus zur Laufzeit erstellen können new XMLHttpRequest.constructor
, sondern vielmehr eine Sammlung von Zeigern auf anonyme Funktionen, die als Schnittstelle für dieses Objekt dienen , mit Ausnahme der Möglichkeit, das Objekt zu erstellen. Und es macht nicht einmal Sinn, das Objekt zu "löschen", denn es ist wie der Versuch, eine Struktur zu löschen. Sie können es nicht: Es ist nur eine Stapelbeschriftung. Schreiben Sie es einfach, wie Sie möchten, unter einer anderen Beschriftung benutze eine Klasse als 4 Ganzzahlen:
/* i imagine this string gets compiled into a struct, one of which's members happens to be a const char * which is initialized to exactly your string: no function calls are made during construction. */
std::string a = "hello, world";
int *myInt = (int *)(*((void **)&a));
myInt[0] = 3;
myInt[1] = 9;
myInt[2] = 20;
myInt[3] = 300;
Es gibt keinen Speicherverlust, es gibt keine Probleme, außer dass Sie effektiv eine Menge Stapelspeicherplatz verschwendet haben, der für die Objektschnittstelle und die Zeichenfolge reserviert ist, aber Ihr Programm wird nicht zerstört (solange Sie nicht versuchen, es zu verwenden) als eine Zeichenfolge immer wieder).
Wenn meine früheren Annahmen richtig sind: Die vollständigen Kosten der Zeichenfolge bestehen nur aus den Kosten für das Speichern dieser 32 Bytes und dem konstanten Zeichenfolge-Speicherplatz: Die Funktionen werden nur zur Kompilierungszeit verwendet und können auch nachher eingebettet und weggeworfen werden Das Objekt wird erstellt und verwendet (Als ob Sie mit einer Struktur gearbeitet hätten und nur direkt ohne Funktionsaufrufe darauf verwiesen hätten, stellen Sie sicher, dass es doppelte Aufrufe anstelle von Funktionssprüngen gibt, dies ist jedoch in der Regel schneller und benötigt weniger Speicherplatz). Wenn Sie eine Funktion aufrufen, ersetzt der Compiler diesen Aufruf im Wesentlichen durch die entsprechenden Anweisungen, mit Ausnahme der von den Sprachentwicklern festgelegten Ausnahmen.
Zusammenfassung: C ++ - Objekte haben keine Ahnung, was sie sind. Alle Tools für die Schnittstelle sind statisch inline und gehen zur Laufzeit verloren. Dies macht das Arbeiten mit Klassen so effizient wie das Füllen von Strukturen mit Daten und das direkte Arbeiten mit diesen Daten, ohne dass Funktionen überhaupt aufgerufen werden (diese Funktionen sind inline).
Dies unterscheidet sich grundlegend von den Ansätzen von COM / ObjectiveC sowie von Javascript, bei denen die Typinformationen dynamisch beibehalten werden. Dies geht zu Lasten des Laufzeit-Overheads, der Speicherverwaltung und der Aufrufe von Konstruktionen, da der Compiler diese Informationen nicht wegwerfen kann. Dies ist erforderlich für den dynamischen Versand. Dies gibt uns die Möglichkeit, zur Laufzeit mit unserem Programm zu "sprechen" und es im laufenden Betrieb mit reflektierbaren Komponenten zu entwickeln.