12

reallocは元のデータのサイズをどのように知るのですか?

 void *realloc(void *ptr, size_t size);

したがって、実装が次のような場合:

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

これは元の実装ではなく、reallocが常に無料であるとは限りませんが、無料である場合、どのくらいコピーしますか?

編集:答えてくれてありがとう。しかし、malloc / free / ..を使用してコードにreallocを実装するにはどうすればよいですか?

4

5 に答える 5

21

mallocあなたがそれを呼んだときにその情報を記録したので、それは知っています。結局のところ、システムは、メモリの特定の領域を2回割り当てないように、割り当てられたブロックのサイズを追跡する必要があります。

「これまでに書き込んだ配列の量をどのようにして知ることができるか」という意味であれば、そうする必要はありません。初期化されていないガベージもコピーできます。

于 2010-08-13T11:45:52.970 に答える
3

But how can I then implement realloc in my code with malloc/free/..?

すでに malloc と free を使用している場合は、realloc を使用してみませんか? それ以外の場合は、MSVC/gcc などに同梱されている CRT ソースを見て (または、GCC の場合はダウンロードして)、それらがどのように実装されているかを確認できます。カスタムアロケーターを実行している場合は、もう少し状況に応じて、たとえば、スラブ型システムでバイナリビンを使用します。この場合、realloc は単純です。

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;
}
于 2010-08-13T12:36:24.573 に答える
1

お使いの C 標準ライブラリで malloc/calloc/realloc/free がどのように実装されているか調べてみませんか?

または、ソース コードにアクセスできない場合は、オープン ソースの C 標準ライブラリの 1 つでどのように実装されているかを調べてください。

于 2010-08-13T12:57:32.887 に答える
1

メモリを使用する場合malloc、取得するブロックは通常、ブロックのサイズなどの追加情報も保持する、より大きなデータ構造への固定オフセットです。これが一部のシステムで正しいことを確認するには、 によって返されるすべてのアドレスが 16 進数で出力されたときにmalloc終了することに注意してください (たとえば、 への置換)。もちろん、このオフセットを逆にしてメモリ管理構造に戻ることができるので、サイズを取得できます。そこから、(必要に応じて)コピーする量を知ることができるのは簡単です…</p> 8%pprintfrealloc

于 2010-08-13T11:58:58.653 に答える
1

realloc (および malloc と free) は、ヒープを構成するデータ構造全体に完全にアクセスできます。そのデータ構造には、ブロックのサイズに関する情報があり、再割り当てが知る必要があり、解放も必要です。

于 2010-08-13T11:46:33.933 に答える