Croissance géométrique des allocations
Quand on alloue une structure de taille croissante en progression géométrique, il vaut mieux le faire avec un facteur inférieur au nombre d’or

J’ai vu cette idée mentionnée pour la première fois dans une discussion sur news:comp.lang.c++.moderated.
   Quand on a une structure telle que les std::vector du C++, il est courant d’augmenter la
taille en utilisant une progression géométrique. Cela permet de conserver une complexité en
temps constant pour l’ajout. La mémoire utilisée est donc :  ,
,  ,
,  , . . .
, . . . où
 où  est l’allocation initiale et
est l’allocation initiale et  le facteur de la progression (donc
 le facteur de la progression (donc  ). Pour diminuer les risques
d’avoir de la mémoire inutilisée, on désire que la prochaine allocation, de
). Pour diminuer les risques
d’avoir de la mémoire inutilisée, on désire que la prochaine allocation, de  , puisse se faire
dans l’espace libéré précédemment, soit
, puisse se faire
dans l’espace libéré précédemment, soit  . La première allocation
. La première allocation  étant un facteur
commun, on peut le simplifier. Il faut donc :
 étant un facteur
commun, on peut le simplifier. Il faut donc :

 étant supérieur à 1, pour
étant supérieur à 1, pour  tendant vers l’infini
 tendant vers l’infini  tend aussi vers l’infini, on peut donc ignorer
 tend aussi vers l’infini, on peut donc ignorer
 et il reste
 et il reste
   

inéquation du second degré dont qui est vraie pour

Naturellement, rien ne garanti que l’allocateur pourra effectivement réutiliser la mémoire libérée. En particulier, il ne pourra pas le faire si elle ne forme pas un bloc contigu, ce qui est probable si d’autres allocations ont lieu entre les réallocations du vecteur.
   Plus  est petit, moins il faudra utiliser de blocs précédemment utilisés. Pour
 est petit, moins il faudra utiliser de blocs précédemment utilisés. Pour  (racine de
(racine de  ), les deux derniers blocs suffisent ; pour
), les deux derniers blocs suffisent ; pour  (racine de
 (racine de
 ) il faut les trois derniers et pour
) il faut les trois derniers et pour  (racine de
 (racine de  ) il
faut les quatre derniers blocs. En pratique, des facteurs de
) il
faut les quatre derniers blocs. En pratique, des facteurs de  et
 et  sont les plus faciles à
programmer, il suffit d’ajouter le quart ou la moitié de la taille déjà allouée.
 sont les plus faciles à
programmer, il suffit d’ajouter le quart ou la moitié de la taille déjà allouée.
   
Historique
- 11 octobre 2006
- version initiale
- 15 octobre 2006
- absence de garantie de réutilisation, valeur numérique de  et quelques
      bornes supplémentaires. et quelques
      bornes supplémentaires.
- 25 février 2009
- clarification et utilisation de TEX4ht pour avoir une version HTML.