12
votes

Comment Realloc sait-il combien copier?

Comment Realloc connaît-il la taille des données d'origine? XXX PRE>

Donc, si la mise en œuvre est comme ceci: p>

 temp = malloc(size);
 memcpy(.. // How much to copy?
 free(ptr);
 return temp;


1 commentaires

Votre mise en œuvre de Realloc devra suivre la mise en œuvre de MALLOC et GRATUITEMENT. La mise en œuvre sans la connaissance spéciale que MALLOC et GRATUITE n'a pas vraiment été faisable. Si vous avez obtenu le travail avec une implémentation MALLOC, cela ne fonctionnerait probablement pas avec les autres.


5 Réponses :


21
votes

Il sait parce que masloc a enregistré cette information lorsque vous l'avez appelé. Après tout, le système doit garder une trace de la taille des blocs alloués de toute façon afin qu'il n'alloue pas deux fois une région de mémoire particulière.

Si vous voulez dire, comment ça sait combien de la matrice que j'ai écrite jusqu'à présent », cela n'a pas besoin de. Il peut simplement copier des ordures non initialisées également.


1 commentaires

Dépend de la mise en œuvre. Vous pouvez supposer en toute sécurité que ce n'est pas accessible à vous de manière portable.



1
votes

Realloc (et Malloc et gratuit) ont un accès complet à l'ensemble de la source de données qui constitue le tas. Dans cette DataStructure, des informations sur la taille des blocs, qui ont besoin de savoir, de manière libre.


0 commentaires

1
votes

Lorsque vous MALLOC Certaines mémoire, le bloc que vous obtenez est généralement un décalage fixe dans une structure de données plus grande qui contient également des informations supplémentaires, notamment la taille du bloc. Vous pouvez vérifier que cela est vrai sur certains systèmes en notant que chaque adresse renvoyée par Malloc se termine dans 8 lorsqu'il est imprimé en hexal (par exemple, avec le % p Substitution à PrintF ). Bien sûr, realloc peut inverser ce décalage et revenir à la structure de gestion de la mémoire, puis obtenir la taille; De là, être capable de savoir combien de copier (si nécessaire) est trivial ...


0 commentaires

3
votes

Mais comment puis-je puis implémenter realloc dans mon code avec malloc / free /..?

Si vous utilisez déjà MALLOC & GRATUIT, pourquoi pas simplement utiliser Realloc? sinon, vous pouvez simplement consulter la source CRT qui est livré avec MSVC / GCC, etc. (Ou tout simplement le télécharger, dans le cas de GCC) et voyez comment ils le mettent en œuvre. Si vous exécutez un allocator personnalisé, c'est un peu plus situationnelle, par exemple: j'utilise une corbeille binaire avec un système de type dalle, auquel cas Realloc est simple: P>

void* Reallocate(Manager* pManager, void* pBlock, size_t nSize, const char* szFile, const DWORD dwLine)
{
    #if ( MMANAGER_NULL_TO_DEFAULT )
        if(pManager == NULL)
            pManager = MMANAGER_DEFUALT_MANAGER;
    #endif

    if(pBlock == NULL)
        return Allocate(pManager,nSize,szFile,dwLine);
    else if(nSize == 0)
    {
        Free(pManager,pBlock,szFile,dwLine);
        return NULL;
    }

    BlockHeader* pHeader = GetHeader(pBlock);
    size_t nPrevSize = pHeader->pPoolBlock->nSize;
    if(nPrevSize < nSize)
    {
        void* pNewBlock = Allocate(pManager,nSize,szFile,dwLine);
        memcpy(pNewBlock,pBlock,nPrevSize);
        PoolBlock* pPoolBlock = pHeader->pPoolBlock;
        if(pPoolBlock == NULL)
            free(pHeader);
        else
            FreeBlock(pPoolBlock,pHeader);

        return pNewBlock;
    }

    return pBlock;
}


0 commentaires

1
votes

Pourquoi ne cherchez-vous pas comment Malloc / Calloc / RealLoc / Gratuit est implémenté dans la bibliothèque standard C utilisée?

ou, si vous n'avez pas accès au code source, examinez la manière dont elle est mise en œuvre dans l'une des bibliothèques standard C Open-Source C.


0 commentaires