Indiquez simplement la taille exacte dont vous avez besoin. La seule raison pour laquelle une taille à la puissance deux pourrait être "meilleure" est de permettre une allocation plus rapide et/ou d'éviter la fragmentation de la mémoire.
Cependant, tout non-trivial malloc
Une implémentation qui se préoccupe d'être efficace va arrondir les allocations de manière interne de cette façon si et quand il est approprié de le faire. Vous n'avez pas besoin de vous préoccuper d'"aider" malloc ; malloc peut très bien se débrouiller tout seul.
Edit :
En réponse à votre citation de l'article de Joel sur les logiciels, le point de vue de Joel dans cette section (qui est difficile à discerner correctement sans le contexte qui suit le paragraphe que vous avez cité) est que si vous vous attendez à ce que les logiciels soient fréquemment utilisés, vous ne devez pas les utiliser. concernant -allouer un tampon, il est préférable de le faire de manière multiplicative, plutôt que de manière additive. C'est, en fait, exactement ce que fait le std::string
y std::vector
en C++ (entre autres) le font.
La raison pour laquelle c'est une amélioration n'est pas parce que vous aidez malloc
en fournissant des chiffres pratiques, mais parce que l'allocation de la mémoire est une coûteux et vous essayez de minimiser le nombre de fois où vous le faites. Joel présente un exemple concret de l'idée d'un compromis temps-espace. Il soutient que, dans de nombreux cas où la quantité de mémoire nécessaire change dynamiquement, il est préférable de gaspiller un peu d'espace (en allouant jusqu'à deux fois plus que ce dont vous avez besoin à chaque expansion) afin d'économiser le temps et l'espace. temps qui serait nécessaire pour ajouter à plusieurs reprises exactement n
octets de mémoire, à chaque fois que vous avez besoin n
plus d'octets.
Le multiplicateur ne doit pas nécessairement être égal à deux : vous pouvez allouer jusqu'à trois fois plus d'espace que nécessaire et obtenir des allocations en puissance de trois, ou allouer jusqu'à cinquante-sept fois plus d'espace que nécessaire et obtenir des allocations en puissance de cinquante-sept. Plus vous faites de surallocation, moins vous devrez réallouer fréquemment, mais plus vous gaspillerez de mémoire. L'allocation en puissances de deux, qui utilise au maximum deux fois plus de mémoire que nécessaire, se trouve être un bon compromis de départ jusqu'à ce que vous ayez une meilleure idée de vos besoins exacts.
Il mentionne au passage que cela permet de réduire la "fragmentation dans la chaîne libre", mais la raison en est davantage le nombre et l'uniformité des allocations effectuées, plutôt que leur taille exacte. D'une part, plus vous allouez et désallouez de la mémoire, plus vous risquez de fragmenter le tas, quelle que soit la taille de l'allocation. Deuxièmement, si vous avez plusieurs tampons que vous redimensionnez dynamiquement à l'aide du même algorithme de redimensionnement multiplicatif, il est probable que si l'un passe de 32 à 64, et un autre de 16 à 32, la réaffectation du second peut s'adapter à la place du premier. Ce ne serait pas le cas si l'un passait de 25 à 60 et l'autre de 16 à 26.
Et encore une fois, rien de ce dont il parle ne s'applique si vous ne faites l'étape d'allocation qu'une seule fois.