que je recherchais dans certaines implémentations de gestion de la mémoire (pool
+ malloc
+ free
) en utilisant la liste chaînée, et je trouve que dans la plupart d'entre eux chaque nœud est quelque chose comme ceci:Pourquoi le pointeur suivant est-il proche du sommet du noeud?
typedef struct node{
int usedSize;
node* next;
char mem[100];
}
et le free(ptr)
doit être:
free(void* ptr){
node* item = (node*)((char*)ptr - sizeof(node*) - sizeof(int));
\\some code to put the "item" back to the pool
}
Ma question est la suivante: pourquoi ne pas mettre le char mem[100];
au début de la structure pour éviter la « manipulation du pointeur »?
le résultat est:
typedef struct node{
char mem[100]; // moved to the beginning
int usedSize;
node* next;
}
puis le free(ptr)
est plus simple:
free(void* ptr){
node* item = (node*)((char*)ptr);
\\some code to put "item" back to the pool
}
Merci.
Cela fonctionnerait correctement si toutes les allocations étaient exactement de 100 octets. Mais si les allocations diffèrent en taille, comment trouvez-vous la taille de l'allocation? Mettre la taille juste avant l'allocation la rend simple. – rici
whonks @rici mais je n'ai pas besoin de le trouver, je peux y accéder en utilisant node-> usedSize Ai-je raté quelque chose? – mvk
merci @jxh pour la réponse (3) dont je n'étais pas au courant. – mvk