سؤال

كيف يعرف 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 التي تستخدمها؟

أو ، إذا لم يكن لديك إمكانية الوصول إلى الكود المصدري ، فابحث عن كيفية تنفيذها في إحدى المكتبات القياسية للمصدر المفتوح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top