Speicherverbrauch beim Instanzieren einer Klasse
-
Hallöchen,
ich habe grad im J.Wolf Buch "C++ von A bis Z" gelesen, dass beim Instanzieren von Klassen nicht jedesmal neu Speicher für die Methoden sondern nur für die Eigenschaften der dann angelegten Objekte vergeben wird, ist das richtig so?
Ich bin dabei eine Klasse für Vektoren zu schreiben und da wäre es ja extreme Resourcenverschwendung wenn für jeden Vektor die dazugehörigen Methoden für Kreuzprodukt etc. bei jeder der Instanzen im Speicher mit angelegt werden würde.
Kann mich hier jemand etwas aufklären was denn genau passiert wenn ich von einer Klasse ein Objekt erzeuge?
Gruß Chris
-
Eine Klasse ist sozusagen eine Struktur mit dazu passenden Memberfunktionen.
Ja es ist richtig so, dass beim Anlegen im speicher nur die Eigentschaften, also die membervariablen im speicher liegen. Der gekoppelte Code, also die memberfunktionen, konstruktor destruktor etc. liegen natürlich nicht doppelt im speicher. Diese sind nur einmal im speicher. Das ganz ekann man sich so vorstellen.:
class A { public: void GibAus(){ cout << m_a << endl; }; void Setze(int a) { m_a = a; }; private: int m_a; }; int main() { A a; a.Setze(7); a.Gibaus(); }Wird so vom compiler umgesetzt:
struct A { friend void GibAus(A* obj); friend void Setzte(A* obj, int a); private: int m_A; } void GibAus(A* obj) { cout << obj->m_A << endl; } void Setze(A* obj, int a) { obj->m_A = a; } int main() { A a; Setze(&a, 7); GibAus(&a); }
-
Natürlich belegen die Methoden usw. keinen Speicherplatz pro Objekt!
Wie du richtig sagst, wäre das enorme Verschwendung, da sie ja immer gleich sind.Lediglich die Attribute, also die Member-Variablen, landen im Speicher. Wenn du virtuelle Methoden benutzt, dann zusätzlich noch ein Zeiger auf die Virtual Function Table.
Der Compiler weiß ja, was für ein Typ dein Objekt hat, und darum weiß er auch, wo er den Code für die Methoden des Objekts findet. Der wird nur einmal irgendwo im Code-Segment gespeichert.
Bei Sprachen wie Ruby oder Python wäre das ein bisschen anders, da es dort keine statische Typisierung gibt und man sogar einzelnen Objekten zur Laufzeit neue Methoden geben kann. Aber auch dort würde der eigentliche Code wohl nur ein einziges Mal irgendwo abgelegt.
-
Besten Dank für die ausführlichen Erklärungen nun habe ich Gewissheit...
Gruß Chris