Как Realloc знает, сколько для копирования?
Вопрос
Как 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.