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:
..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.
3) 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:
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.
_________________ If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
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.
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.
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 )
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.