C dans la norme de gestion de la mémoire fonctions sont malloc()
, realloc()
et free()
. Cependant, C++ stdlib allocateurs parallèle, deux d'entre eux: il n'y a pas de réallocation de la fonction. Bien sûr, il ne serait pas possible de faire exactement la même chose que realloc()
, parce que tout simplement la copie de la mémoire n'est pas approprié pour les non-types de regroupement. Mais y aurait-il un problème avec cette fonction:
bool reallocate (pointer ptr, size_type num_now, size_type num_requested);
où
-
ptr
est allouée au préalable avec le même allocateur pournum_now
objets; -
num_requested
>=num_now
;
et de la sémantique comme suit:
- si l'allocateur pouvez étendre la mémoire bloc
ptr
à partir de la taille pournum_now
objets d'num_requested
objets, il le fait (en laissant davantage de mémoire non initialisée) et les retourstrue
; - sinon il ne fait rien et renvoie
false
.
Accordé, ce n'est pas très simple, mais allocateurs, ce que je comprends, sont là pour les conteneurs et les emballages " le code est généralement compliqué déjà.
Compte tenu de cette fonction, std::vector
, par exemple, pourrait croître comme suit (pseudo-code):
if (allocator.reallocate (buffer, capacity, new_capacity))
capacity = new_capacity; // That's all we need to do
else
... // Do the standard reallocation by using a different buffer,
// copying data and freeing the current one
Allocateurs qui sont incapables de changer la taille de la mémoire au total pourrait tout mettre en œuvre une telle fonction par inconditionnelle return false;
.
Il y a si peu de réaffectation capable de l'allocateur de mise en œuvre que ce ne serait pas la peine de s'embêter? Ou il y a quelques problèmes que j'ai négligé?