Speicherverwaltung



  • Hallo C++ommunity;

    ich habe eine ganz allgemeine Frage zur Speicherverwaltung. Wenn ich ein Objekt anlege, so wird diese ja ,ohne spezielle Deklaration, auf den Stack gelegt. Wo ist aber die Klassenimplementierung resp. die Methodenimplementierung abgespeichert?
    Wird dies im Programmspeicher abgelegt, auf dem Heap, oder sons wo?

    Vielen Dank für eure Antworten. 😃

    Das Zebra



  • Alle Funktionen, Methoden und Konstanten liegen halt in der .exe, die vom OS (oder sonst irgendeinem Mechanismus) in den Speicher geladen wird.



  • Und Memberfunktionen existieren nur einmal, nicht pro Objekt.

    Du kannst dir das so vorstellen, dass das Objekt seinen Memberfunktionen per this -Zeiger als Parameter übergeben wird.

    void MyClass::function(int x);
    // kannst du dir vorstellen als freie Funktion:
    void MyClass_function(MyClass* this, int x);
    


  • Hallo,

    vielen Dank für die Antworten. Doch was ist damit gemeint ... liegen in der .exe. Etwa einfach folgendes:
    Alle Programmanweisungen liegen in diesem File, und werden dann in den Arbeitsspeicher geladen.

    @Nexus
    Danke, für den Tipp. Das hatte ich vorher tatsächlich nie richtig verstanden.

    Vielen Dank
    Zebra



  • Deine Vermutung ist richtig, der Code wird aus der exe-Datei (oder andere ausführbarem Format) in den Speicher geladen und von dort aus ausgeführt.

    Es gibt den Code halt nur einmal pro Klasse, aber Ausnahmen hiervon sind templates. Dabei wird für jeden Typ eine eigen Klasse/Funktion erzeugt, also für std::vector<int> und std::vectorstd::string werden die Methoden zweimal erzeugt und getrennt voneinander gespeichert.

    Eine andere Ausnahme sind als virtual deklarierte Methoden. Hierbei enthält jede Instanz der Klasse eine Tabelle, in der die Speicheraddressen der Methoden stehen.
    Die eigentliche Methoden muss zwar irgendwo implementiert sein, aber welche zu einer Instanz gehört, kann erst zur Laufzeit bestimmt werden.



  • Hallo Marthog,

    vielen Dank für deine Antwort 😃

    Zebra


  • Mod

    Zebra schrieb:

    Hallo Marthog,

    vielen Dank für deine Antwort 😃

    Zebra

    Ich muss jedoch korrigierend eingreifen, da die Antwort etwas ungenau formuliert ist:
    1. Templates: Eine wichtige Erkenntnis ist, dass ein Klassentemplate eben keine Klasse ist. Erst eine Instanzierung eines Klassentemplates ist eine richtige Klasse. Wahrscheinlich meintest du (Marthog) das auch so, aber es war etwas ungenau formuliert. Übrigens werden bei der Instanzierung von Klassentemplates auch nur die Methoden instanziert, die tatsächlich benutzt werden.

    2. Virtuelle Funktionen: Das kann so implementiert sein, muss es aber nicht. Insbesondere die üblichste Implementierung, virtual method tables, die du wahrscheinlich meinst, funktioniert ein bisschen anders, als du beschreibst:
    http://en.wikipedia.org/wiki/Vtable
    Eine eigene Tabelle pro Instanz wäre dagegen viel zu viel Overhead und ohne jeden Vorteil.


Anmelden zum Antworten