Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Memory Pool, Speicher reservieren.     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Pool
Unregistrierter




Beitrag Pool Unregistrierter 22:46:49 01.02.2012   Titel:   Memory Pool, Speicher reservieren.            Zitieren

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.

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:

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.
Pool
Unregistrierter




Beitrag Pool Unregistrierter 12:06:48 06.02.2012   Titel:              Zitieren

...ping. :)
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 3814
Beitrag theta Mitglied 12:12:52 06.02.2012   Titel:              Zitieren

Was für Probleme gibts denn?
knivil
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.02.2009
Beiträge: 4495
Beitrag knivil Mitglied 12:16:28 06.02.2012   Titel:              Zitieren

Zitat:
gibt es mit dem gleichen Code aber Ärger
Tolle Fehlerbeschreibung.

_________________
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.
pumuckl
Moderator

Benutzerprofil
Anmeldungsdatum: 21.06.2005
Beiträge: 6578
Beitrag pumuckl Moderator 15:19:10 06.02.2012   Titel:              Zitieren

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.

_________________
Du brauchst Hilfe? - Kleines Einmaleins der Forenregeln.
When your hammer is C++, everything begins to look like a thumb. (Steve Haflich)
Pool
Unregistrierter




Beitrag Pool Unregistrierter 17:45:28 06.02.2012   Titel:              Zitieren

knivil schrieb:
Zitat:
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
unskilled
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.07.2007
Beiträge: 3712
Beitrag unskilled Mitglied 07:28:35 07.02.2012   Titel:              Zitieren

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.de/forum/274218

_________________
Keiner kann besser nix als ich - Tagedieb mit Lächeln im Gesicht :o)


Zuletzt bearbeitet von unskilled am 07:42:43 07.02.2012, insgesamt 1-mal bearbeitet
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Memory Pool, Speicher reservieren.   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

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.