Manuelle Speicherverwaltung



  • Hallo!

    Ich habe gehört, dass man um die Heap Fragmentierung oft die Speicherverwaltung selbst in die Hand nimmt, indem man am Programmstart einen größeren Speicherblock alloziert und dann seine Objekte in diesem anlegt.
    Kann mir jemand zu ein paar Seiten weisen, die die manuelle Speicherverwaltung beschreiben, denn mein jetziges Bild ist, wie ihr sehen könnt nur sehr ungenau.
    Wenn jemand andere Vorschläge hat um Heap Fragmentierung zu kontern sind diese natürlich auch sehr wilkommen.



  • Kannst recht leicht mit Allokatoren machen wie die STL, oder durch Überladen von operator new und operator delete.

    Fertige Allokatoren findest du auch bei boost



  • OK jetzt ist mir alles von der Theorie her schon einiges klarer. Vielen Dank!

    Eine Frage habe ich aber noch:
    Wenn ich also einen Speicherbereich reserviere, den ich selbst verwalten will, schreibe ich mir also eine Klasse die eine Liste der bereits angeforderten Objekte in dem Speicherbereich und natürlich einen Pointer auf den Speicherbereich selber hat. In dieser Klasse habe ich dann z.B. eine Methode alloc() die mir einen Pointer auf ein gerade angefordertes Onbjekt X zurück gibt. Wie wird allerdings der Konstruktor von X ausgelöst und kann alloc() auch für überladene Konstruktoren verwendet werden oder gibt es da noch eine andere Möglichkeit?



  • tommazzo schrieb:

    OK jetzt ist mir alles von der Theorie her schon einiges klarer. Vielen Dank!

    Eine Frage habe ich aber noch:
    Wenn ich also einen Speicherbereich reserviere, den ich selbst verwalten will, schreibe ich mir also eine Klasse die eine Liste der bereits angeforderten Objekte in dem Speicherbereich und natürlich einen Pointer auf den Speicherbereich selber hat. In dieser Klasse habe ich dann z.B. eine Methode alloc() die mir einen Pointer auf ein gerade angefordertes Onbjekt X zurück gibt. Wie wird allerdings der Konstruktor von X ausgelöst und kann alloc() auch für überladene Konstruktoren verwendet werden oder gibt es da noch eine andere Möglichkeit?

    Wie sieht denn die alloc Funktion bei dir aus?

    mfg.



  • Im Moment gar nicht. Das war nur ein Beispiel bezogen auf die Pool Library von Boost. Ich würde gerne wissen wie so etwas generell funktioniert.



  • Mit placement new.



  • Ringding schrieb:

    Mit placement new.

    OK die Bezeichnung kenne ich jetzt schon mal, wie sieht es mit weiteren Details aus?



  • Nachdem das der gebräuchliche Begriff dafür ist, kann dir dein Freund google sicher einiges dazu sagen. Es ist mehr oder weniger einfach ein new mit einem Zusatzargument (der Adresse).



  • Also wenn ich es richtig verstanden habe dann kann ich den standard new Operator entweder mit dem Überladen von new, placement new oder einem eigenen Allocator umgehen. Wenn ich aber genau bestimmen will wo im Speicher das Objekt liegen soll komme ich um den eigenen Allocator nicht herum. Ist das korrekt?


Anmelden zum Antworten