Bonjour,
Je cherche à faire une pool mémoire permettant d'éviter toutes allocations de mémoire durant l'exécution du programme (enfin, plus précisément, durant la boucle de jeu).
Ma première idée est de reposer sur std::vector et de jouer avec le reserve(), que j'appelle à la construction de ma pool. Ok, c'est bien, mais lorsque je veux mettre un élément dans la pool, cet élément va être créé puis placé dans la pool (surement à travers une copie).
Heureusement, j'utilise emplace_back() permettant d'éviter la copie, si je ne dis pas de bêtises. Malheureusement, il y a toujours allocation de mémoire, notamment à la création de mon nouvel élément à mettre dans la pool.
En théorie, pour que ma pool soit parfaite, il ne faudrait pas que les éléments soient créés lors de la boucle de jeu, mais simplement à la création de la pool.
Pour ce faire, je devrais construire ma pool (mon std::vector) avec un resize(). Ainsi, les éléments seraient déjà prêt et je n'aurais qu'à les utiliser. Dans la boucle de jeu, je vais créer des objets qui seront dans la pool. En théorie, on les construiraient (avec des arguments), mais là, ce n'est pas exactement ce que je veux faire. Et là, je ne vois pas exactement comment faire, pour injecter de nouveaux éléments (ou du moins, des données pour construire les éléments) dans la pool, sans jamais faire d'allocation mémoire pour ces éléments.
Du coup, ma question est : comment bien faire. Je pensais que la sémantique de déplacement pourrait faire ce type "d'injection".
Voici mon implémentation de pool actuelle : https://github.com/LittleWhite-tb/Pa...ObjectPool.hpp
Est-ce que la meilleure solution est bien d'allouer la mémoire avec resize() (pour que tous les éléments soient créé), puis, lorsque j'ai besoin de faire un get() pour récupérer l'élément. Mais dans ce cas là, comment je construis l'élément (comme une réinitialisation, ou autre ?). Normalement, j'utiliserai un constructeur, mais dans un tel cas, cela n'irait pas, je crois, notamment car on ne peux pas appeler le constructeur à la main.
Partager