Effectivement, cela a l'air de venir de fast_pool_allocator. J'ai essayé avec un simple « new Foo[NB_ALLOC] » et la consommation redevient celle attendue. Je n'ai pas esssayé avec « pool_allocator » tout court car l'interface n'est pas tout-à-fait la même et que ça me faisait suer d'adapter tout ton exemple. :-) Ça ne m'étonne qu'à moitié car privilégier la vitesse se fait traditionnellement au dépit de la mémoire. Les liens entre les deux sont évidemment complexes mais on arrive généralement à une relation inversement proportionnelles, ou à peu près.
En affichant dans la boucle les valeurs des pointeurs renvoyés par new, on s'aperçoit qu'ils sont consécutifs et croissants puis qu'ils sautent brusquement, à intervalles réguliers, d'une plage vers une autre. Il est donc raisonnable de penser que le pool alloue d'emblée une plage suffisamment grande mais de taille arbitraire au départ et que, comme tu ne fais que la remplir sans libérer tes objets (dans ton exemple), à chaque fois qu'il se retrouve au dépourvu, il décide d'allouer cette fois une plage deux fois plus grande que la précédente.
# FAST pool allocator
Posté par Obsidian . En réponse au message operator new + boost::fast_pool_allocator. Évalué à 4.
Hello,
Effectivement, cela a l'air de venir de fast_pool_allocator. J'ai essayé avec un simple «
new Foo[NB_ALLOC]» et la consommation redevient celle attendue. Je n'ai pas esssayé avec « pool_allocator » tout court car l'interface n'est pas tout-à-fait la même et que ça me faisait suer d'adapter tout ton exemple. :-) Ça ne m'étonne qu'à moitié car privilégier la vitesse se fait traditionnellement au dépit de la mémoire. Les liens entre les deux sont évidemment complexes mais on arrive généralement à une relation inversement proportionnelles, ou à peu près.En affichant dans la boucle les valeurs des pointeurs renvoyés par
new, on s'aperçoit qu'ils sont consécutifs et croissants puis qu'ils sautent brusquement, à intervalles réguliers, d'une plage vers une autre. Il est donc raisonnable de penser que le pool alloue d'emblée une plage suffisamment grande mais de taille arbitraire au départ et que, comme tu ne fais que la remplir sans libérer tes objets (dans ton exemple), à chaque fois qu'il se retrouve au dépourvu, il décide d'allouer cette fois une plage deux fois plus grande que la précédente.