Comment realloc fonctionne en tâche de fond?

Comment realloc fonctionne réellement en arrière-plan? S’il n’y a pas assez de mémoire disponible à l’ancien emplacement, celui-ci alloue deux / plusieurs blocs de mémoire et un pointeur pointant sur celui-ci et sur un autre est lié de manière interne entre eux ou l’ancienne région est copiée dans un nouvel emplacement où suffisamment de mémoire est disponible et où le pointeur est mis à jour à la nouvelle adresse et la suppression de l’ancienne mémoire?

Et ce realloc est -il dépendant ou indépendant du compilateur / du système d’exploitation ?

realloc tente d’étendre la plage de mémoire disponible si suffisamment de mémoire est disponible derrière elle sur le tas. Si ce n’est pas le cas, cela équivaut à malloc un bloc de la nouvelle taille, memcpy votre contenu là-bas, free l’ancien bloc. Ceci est indépendant du système d’exploitation et du compilateur et dépend de l’implémentation de libc laquelle vous liez.

Sur une note similaire: mremap/MREMAP_MAYMOVE (disponible sur Linux moderne) tentera d’étendre votre mappage virtuel à la taille demandée. Si ce n’est pas possible, votre mappage sera déplacé vers une nouvelle adresse virtuelle disposant d’un espace suffisant pour la machine virtuelle, puis étendu. Ceci est très rapide si vous redimensionnez fréquemment des mappages volumineux, car aucune copie physique n’est effectuée.

Une implémentation de realloc() peut ressembler à ceci:

 void * realloc(void *ptr, size_t size) { // realloc() on a NULL pointer is the same as malloc(). if (ptr == NULL) return malloc(size); size_t oldsize = malloc_getsize(ptr); // Are we shrinking an allocation? That's easy. if (size < oldsize) { malloc_setsize(ptr, size); return ptr; } // Can we grow this allocation in place? if (malloc_can_grow(ptr, size)) { malloc_setsize(ptr, size); return ptr; } // Create a new allocation, move the data there, and free the old one. void *newptr = malloc(size); if (newptr == NULL) return NULL; memcpy(newptr, ptr, oldsize); free(ptr); return newptr; } 

Notez que j'appelle plusieurs fonctions dont le nom commence par malloc_ ici. Ces fonctions n'existent pas réellement (à ma connaissance) dans aucune implémentation; ils sont conçus comme des espaces réservés pour cependant l'allocateur effectue ces tâches en interne.

L'implémentation de realloc() dépendante de ces outils internes, son implémentation dépend du système d'exploitation. Cependant, l'interface realloc() est universelle.

Si l’ancien pointeur ne peut pas être redimensionné sur place, un nouveau est atsortingbué, le contenu est copié et l’ancien est libéré.