سؤال
كيف يعرف 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) بالوصول الكامل إلى بنية البيانات بأكملها والتي تشكل الكومة. في قاعدة البيانات هذه ، توجد معلومات حول أحجام الكتل ، والتي تحتاج إلى معرفتها ، وكذلك مجانًا.
عندما انت malloc
بعض الذاكرة ، عادةً ما تكون الكتلة التي تحصل عليها عبارة عن إزاحة ثابتة في بنية بيانات أكبر تحتوي أيضًا على معلومات إضافية ، لا سيما حجم الكتلة. يمكنك التحقق من أن هذا صحيح على بعض الأنظمة من خلال الإشارة إلى أن كل عنوان تم إرجاعه بواسطة malloc
ينتهي 8
عند طباعتها في Hex (على سبيل المثال ، مع %p
استبدال printf
). بالطبع، realloc
يمكن عكس هذا الإزاحة والعودة إلى بنية إدارة الذاكرة ، وبالتالي الحصول على الحجم ؛ من هناك ، القدرة على معرفة مقدار النسخ (عند الضرورة) تافهة ...
لماذا لا تبحث فقط عن كيفية تنفيذ Malloc/Calloc/RealLoc/Free في المكتبة القياسية C التي تستخدمها؟
أو ، إذا لم يكن لديك إمكانية الوصول إلى الكود المصدري ، فابحث عن كيفية تنفيذها في إحدى المكتبات القياسية للمصدر المفتوح.