Memory Pool, Speicher reservieren.



  • Hallo!

    Da Boost fallweise nicht eingesetzt werden kann, ist ein eigener Memory
    Pool entstanden. Folgende Eckpunkte:

    1. Beim einmaligen Reservieren von Speicher durch den Pool soll kein
      Konstruktor aufgerufen werden, daher kommt nicht new[], sondern malloc/free
      zum Einsatz. Ist das sauber oder sollte mit new char[num*sizeof(MyClass)]
      gearbeitet werden? Vor- und Nachteile?

    2. Klassen, deren Instanzen im Pool gebaut werden, haben einen operator new
      in der folgenden Art:

    void *MyClass::operator new(size_t siz, Pool<MyClass>& pMem)
    {
    return pMem->get();
    }

    ..wobei der Pool selbst ein Template ist, das mit dem MyClass-Typ parametrisiert
    ist, wordurch der Pool bereits die Größe von MyClass kennt und auf den
    Parameter siz verzichten kann.

    1. Der Destruktor so einer Klasse soll aufgerufen werden können. Allerdings
      ohne daß er Speicher freigibt, denn das soll ja der Pool einmalig mit free
      erledigen. Daher:

    MyClass
    {
    public:
    static void operator delete (void 😉 {};

    }

    Dieser Ansatz ist implementiert und funktioniert unter Linux und Windows 64bit.
    Auf Windows 32-bit gibt es mit dem gleichen Code aber Ärger. Ich habs auf
    Speicher, der vom Pool kommt, eingegrenzt und suche die genaue Ursache noch.
    Daher wollte ich dieses prinzipielle Design diskutieren.



  • ...ping. 🙂



  • Was für Probleme gibts denn?



  • gibt es mit dem gleichen Code aber Ärger

    Tolle Fehlerbeschreibung.



  • Lies dir bitte dringendst die mit "wichtig" gekennzeichneten Threads in diesem Forum durch (vor allem den, auf den meine Signatur verlinkt) und stelle deine Frage dann bitte noch einmal. So, dass man sie auch beantworten kann.



  • knivil schrieb:

    gibt es mit dem gleichen Code aber Ärger

    Tolle Fehlerbeschreibung.

    Bedaure, wenn mein Post nicht klar war. Hier soll kein konkreter Fehler
    diskutiert werden. Der zitierte Satz sagt aus, daß es einen Grund gibt,
    das Design zu hinterfragen. Nur ob die Eckpunkte 1,2,3 sauber gelöst
    sind, wollte ich diskutieren und auf Verbesserungspotential abklopfen.

    mfg



  • Ich habe bei solchen Problemen immer einen eigenen Allocator geschrieben.
    Den Speicher habe ich üblicherweise mit new char[X] angefordert und beim construct eben ein placement new aufgerufen.
    Ich weiß aber noch, dass ich damals ein Problem mit dem alignment hatte, das ging aber auch relativ einfach zu lösen. Per std::alignment_of in type_traits .
    Zerstört wird überlicherweise mit allocator::destroy.

    Jetzt überlädst du noch die operatoren new und delete + new[] und delete[], wenn du den allocator nicht in deinem eigenen code drin haben möchtest und bist fertig.
    (dann denkst du noch mal an das alignment und guckst, ob du das bedacht hast und wirst deinen Fehler ziemlich sicher finden ;))

    bb

    edit: das hilft dir bestimmt - klingt ziemlich genau nach deinem problem: http://www.c-plusplus.net/forum/274218


Log in to reply