La conception de l'API std::allocator
- le concept Allocator
- vise à faciliter le travail des remplacements potentiels.
std::allocator
est une abstraction sur le modèle de mémoire sous-jacent
Ça ne doit pas l'être! En général, un allocateur n'a pas besoin d'utiliser malloc
et free
du C, ni delete
ou le new
non en place. Oui, celui par défaut le fait généralement, mais le mécanisme de l'allocateur n'est pas simplement une abstraction sur le modèle de mémoire du C. Être différent est souvent tout le but d'un allocateur personnalisé. N'oubliez pas que les allocateurs sont remplaçables : un std::allocator
particulier pourrait ne pas avoir besoin de la taille pour la désallocation, mais il est probable que tous remplacements en auront besoin.
Une implémentation conforme de std::allocator
est libre d'affirmer que vous passez effectivement le bon n
à deallocate
, et de dépendre par ailleurs de la taille correcte.
Il arrive que malloc
et free
stockent la taille du morceau dans leurs structures de données. Mais en général, un allocateur pourrait ne pas le faire, et exiger qu'il le fasse est une pessimization prématurée. Supposons que vous aviez un allocateur de pool personnalisé et que vous allouez des morceaux d'entiers. Sur un système 64 bits typique, cela représenterait un surdébit de 200% pour stocker un size_t
de 64 bits avec l'entier de 32 bits. L'utilisateur de l'allocateur est bien mieux placé pour soit stocker la taille avec l'allocation, soit déterminer la taille de manière moins coûteuse.
Les bonnes implémentations de malloc ne stockent pas la taille d'allocation pour chaque petite allocation; elles sont capables de déduire la taille du morceau à partir du pointeur lui-même, par exemple en dérivant un pointeur de bloc du pointeur de morceau, puis en inspectant l'en-tête de bloc pour la taille du morceau. Ce n'est qu'un détail bien sûr. Vous pourriez obtenir la limite inférieure sur la taille en utilisant des API spécifiques à la plate-forme, comme malloc_size
sur OS X, _msize
sur Windows, malloc_usable_size
sur Linux.