Voor een scenegraph 3D engine (win32/DirectX) wil ik graag gebruik maken van memory pools. Voor degenen die daar nog niet mee bekend zijn: het idee is dat je uit een pool geheugen kunt alloceren en als je d'r mee klaar bent alle allocaties uit die pool in 1x vrij kunt geven; iets wat wel erg handig is als je met (potentieel) veel dynamisch gealloceerde objecten werkt.
Nu heb ik echter een probleempje met de precieze implementatie. Het alloceren van objecten gaat probleemloos: gewoon operator new op een handige plek overriden met een extra placement argument (om de te gebruiken pool aan te geven). Ik zie alleen niet heel erg goed hoe ik dat vrijgeven moet implementeren.
Ja, natuurlijk kan ik 't geheugen wat de pool heeft gealloceerd teruggeven aan 't systeem. Echter, een scenegraph node heeft verwijzingen naar o.a. textures en meshes, die (in dit geval) door DirectX gealloceerd en beheerd worden. Die moeten natuurlijk ook vrijgegeven worden, en de aangewezen plaats daarvoor is de destructor van een scenegraph node. En dus moet ik mijn pool allocator zo ver krijgen dat 'ie die aanroept.
Nu is een hele simpele oplossing natuurlijk om m'n memory pool class een template te maken die de class waarvoor geheugen te alloceren valt als argument neemt. Dat is in dit geval helaas geen handige oplossing, aangezien ik ook met sub-pools wil werken.
Wat ik in gedachten had was een SafePoolObject class te maken, die een virtual destructor heeft. Als van een class objecten in een pool terecht komen en de destructor dient daarop te worden aangeroepen, dan moet deze SafePoolObject subclassen. Deze laatste heeft z'n eigen operator new en methoden en members om te zorgen dat binnen de pool een linked list van SafePoolObject's wordt aangelegd. Als 't geheugen van een pool vrijgegeven wordt word eerst even deze lijst afgelopen, wordt elk element naar een SafePoolObject gecast en daarop de destructor aangeroepen.
Ik vraag me echter af of dat wel goed gaat. Want het SafePoolObject-deel van een object staat niet noodzakelijkerwijs als eerste in 't geheugen natuurlijk.
Kan iemand met wat meer verstand van de win32 C++ ABI dan ik hier misschien zijn/haar licht over laten schijnen? Of weet iemand misschien een handiger manier om nette destructie van pool-gealloceerde objecten te implementeren?
Nu heb ik echter een probleempje met de precieze implementatie. Het alloceren van objecten gaat probleemloos: gewoon operator new op een handige plek overriden met een extra placement argument (om de te gebruiken pool aan te geven). Ik zie alleen niet heel erg goed hoe ik dat vrijgeven moet implementeren.
Ja, natuurlijk kan ik 't geheugen wat de pool heeft gealloceerd teruggeven aan 't systeem. Echter, een scenegraph node heeft verwijzingen naar o.a. textures en meshes, die (in dit geval) door DirectX gealloceerd en beheerd worden. Die moeten natuurlijk ook vrijgegeven worden, en de aangewezen plaats daarvoor is de destructor van een scenegraph node. En dus moet ik mijn pool allocator zo ver krijgen dat 'ie die aanroept.
Nu is een hele simpele oplossing natuurlijk om m'n memory pool class een template te maken die de class waarvoor geheugen te alloceren valt als argument neemt. Dat is in dit geval helaas geen handige oplossing, aangezien ik ook met sub-pools wil werken.
Wat ik in gedachten had was een SafePoolObject class te maken, die een virtual destructor heeft. Als van een class objecten in een pool terecht komen en de destructor dient daarop te worden aangeroepen, dan moet deze SafePoolObject subclassen. Deze laatste heeft z'n eigen operator new en methoden en members om te zorgen dat binnen de pool een linked list van SafePoolObject's wordt aangelegd. Als 't geheugen van een pool vrijgegeven wordt word eerst even deze lijst afgelopen, wordt elk element naar een SafePoolObject gecast en daarop de destructor aangeroepen.
Ik vraag me echter af of dat wel goed gaat. Want het SafePoolObject-deel van een object staat niet noodzakelijkerwijs als eerste in 't geheugen natuurlijk.
Kan iemand met wat meer verstand van de win32 C++ ABI dan ik hier misschien zijn/haar licht over laten schijnen? Of weet iemand misschien een handiger manier om nette destructie van pool-gealloceerde objecten te implementeren?
[ Voor 1% gewijzigd door Verwijderd op 19-08-2006 16:19 . Reden: Linkje naar APR memory pool beschrijving toegevoegd ]