J'ai lu qu'il réduit en quelque sorte la fragmentation, mais je ne comprends pas vraiment pourquoi c'est le cas.
C'est exact. Et cela fonctionne parce que cela fixe une taille minimale pour les allocations. Disons que vous ajoutez du padding pour que chaque bloc fasse au moins 1kB. Cela signifie qu'il n'y aura jamais de situation où vous libérez une partie de la mémoire et où une allocation faite après cela ne tiendra pas dans cette mémoire nouvellement libérée, tant que la nouvelle allocation fait au maximum 1 ko.
Vous pouvez facilement constater cet effet par vous-même en réalisant quelques expériences simples sur une feuille de papier. Commencez par avoir une taille de bloc égale à votre mémoire totale. Bien sûr, il n'y aura pas de fragmentation, mais vous gaspillerez beaucoup de mémoire. Si la taille du bloc est égale à la moitié de la taille totale, c'est à peu près le même scénario, mais avec moins de gaspillage. Lorsque la taille du bloc correspond à un tiers de la mémoire totale, nous rencontrons d'abord la fragmentation. Et cela se produit lorsque le bloc du milieu est alloué.
En bref, le remplissage réduit la fragmentation mais nécessite plus de mémoire.
Dois-je remplir tout le bloc dans un format de 4 ou 8 octets multiples ou dois-je remplir mon bloc en excluant l'en-tête et le pied de page ?
Si vous l'implémentez de manière intelligente, vous pourrez alors modifier la taille du rembourrage en changeant simplement une variable. Trouvez donc un moyen de mesurer les problèmes et d'adapter le rembourrage à vos besoins.
Est-ce que cela aide aussi la localité dans mon programme et comment cela aide-t-il ?
C'est plus délicat. Cela peut aller dans les deux sens et dépend des programmes qui utilisent le tas. Mais mon intuition me dit que le remplissage diminuerait probablement la localité. Si c'est le cas, cela peut avoir un impact sur les performances à cause des ratés du cache.