Как Realloc знает, сколько для копирования?

StackOverflow https://stackoverflow.com/questions/3476448

  •  28-09-2019
  •  | 
  •  

Вопрос

Как Realloc знает размер оригинальных данных?

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

Итак, если реализация такая:

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

Я понимаю, что это не оригинальная реализация, и Realloc не всегда делает бесплатно, но когда он делает, сколько он копирует?

Редактировать: Спасибо за ответы. Но как я могу использовать Realloc в моем коде с Malloc / Free / ..?

Это было полезно?

Решение

Это знает, потому что malloc записал эту информацию, когда вы назвали ее. В конце концов, система должна следить за размерами выделенных блоков в любом случае, чтобы он не выделял определенный регион памяти дважды.

Если вы имеете в виду: «Как он знает, сколько из массива я написал до сих пор», ему не нужно. Это может просто скопировать любой неинициализированный мусор.

Другие советы

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

Если вы уже используете Malloc & Free, почему бы просто использовать Realloc? Иначе вы можете просто взглянуть на источник CRT, который поставляется с MSVC / GCC и т. Д. (Или просто загрузить его в случае 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;
}

RealLoc (и Malloc и Free) имеют полный доступ ко всей Datastructure, которая составляет кучу. В этой Datastructure информация о размерах блоков, которые необходимо знать Realloc, и так не делает.

Когда ты malloc Некоторая память, блок, который вы получаете, обычно является фиксированным смещением в более широкой структуре данных, которая также содержит дополнительную информацию, в частности, размер блока. Вы можете убедиться, что это верно в некоторых системах, просто отмечая, что каждый адрес возвращен malloc заканчивается 8 при напечатании в Hex (например, с %p замена printf). Конечно, realloc может поменять это смещение и вернуться к структуре управления памятью, поэтому получить размер; Оттуда, будучи возможность узнать, сколько для копирования (при необходимости) тривиально ...

Почему бы вам просто не посмотреть, как Malloc / Calloc / RealLoc / Free реализован в стандартной библиотеке C, которые вы используете?

Или, если у вас нет доступа к исходному коду, посмотрите, как он реализован в одном из стандартных библиотек в открытом источнике C.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top