سؤال

في حين أن هناك الكثير من التطبيقات المتطورة المختلفة لـ malloc / free بالنسبة لـ C/C ++ ، أبحث عن واحدة صغيرة بسيطة و (خاصة) تعمل على مخزن مؤقت للحجم الثابت ويدعم realloc. سلامة الخيط وما إلى ذلك ليست مطلوبة وكائناتي صغيرة ولا تختلف في الحجم. هل هناك أي تطبيق يمكن أن توصي به؟

تعديل:

سأستخدم هذا التنفيذ لمخزن مؤقت للاتصال في جهاز الاستقبال لنقل الكائنات بحجم متغير (غير معروف للمستقبل). لن تعيش الكائنات المخصصة لفترة طويلة ، ولكن ربما هناك العديد من الكائنات المستخدمة في نفس الوقت.

كما يبدو أن الجميع يوصيون Malloc القياسي ، ربما ينبغي علي إعادة صياغة سؤالي. ما أحتاجه هو تطبيق "أبسط" Malloc على رأس المخزن المؤقت الذي يمكنني البدء في تحسينه لاحتياجاتي الخاصة. ربما كان السؤال الأصلي غير واضح لأنني لا أبحث عن ملوك محسّن ، فقط للحصول على وسام بسيط. لا أريد أن أبدأ بـ glibc-malloc وأن يمتدها ، ولكن مع واحد خفيف الوزن.

هل كانت مفيدة؟

المحلول

يبدو أن Kerninghan & Ritchie قد وفرت Malloc / Free في كتاب C - هذا بالضبط ما كنت أبحث عنه (وجدت إعادة التنفيذ هنا). سأضيف فقط releloc بسيط.

ما زلت سعيدًا باقتراحات التطبيقات الأخرى التي تكون بسيطة وموجزة مثل هذا واحد (على سبيل المثال ، باستخدام قوائم مرتبطة بشكل مضاعف).

نصائح أخرى

أوصي بتلك التي جاءت مع مكتبة قياسية مجمعة مع المترجم الخاص بك.

ينبغي للمرء أن يلاحظ أيضًا أنه لا توجد طريقة قانونية لإعادة تعريف Malloc/Free

ال malloc/free/realloc من شبه المؤكد أن يأتي ذلك مع برنامج التحويل البرمجي أفضل من بعض الوظائف التي ستقوم بتوصيلها.

من الممكن تحسين الأشياء للكائنات ذات الحجم الثابت ، ولكن عادة لا يتضمن محاولة استبدال malloc ولكن بدلا من استكمالها مع برك الذاكرة. عادة ، سوف تستخدم malloc للحصول على جزء كبير من الذاكرة التي يمكنك تقسيمها إلى كتل منفصلة من الحجم المناسب ، وإدارة تلك الكتل.

يبدو لي أنك تبحث عن تجمع الذاكرة. ال مكتبة وقت تشغيل Apache لديه واحدة جيدة ، وهي منصة متقاطعة أيضًا.

قد لا يكون الوزن خفيفًا تمامًا ، لكن المصدر مفتوح ويمكنك تعديله.

عمومًا لن أعيد اختراع العجلة مع وظائف التخصيص ما لم نمط استخدام الذاكرة الخاص بي إما غير مدعوم بواسطة Malloc/etc. أو يمكن تقسيم الذاكرة إلى مناطق واحدة أو أكثر مسبقًا ، تحتوي كل منها على أكوام أو اثنين من أكوام LIFO (تحرير أي كائن يطلق جميع الكائنات في نفس الكومة التي تم تخصيصها بعد ذلك). في نسخة شائعة من السيناريو الأخير ، المرة الوحيدة التي يتم فيها تحرير أي شيء ، كل شىء تم تحريره. في مثل هذه الحالة ، قد يتم إعادة كتابة Malloc () بشكل مفيد على النحو التالي:

char *malloc_ptr;
void *malloc(int size)
{
  void *ret;
  ret = (void*)malloc_ptr;
  malloc_ptr += size;
  return ret;
}

بايت صفر من النفقات العامة لكل كائن مخصص. مثال على السيناريو الذي تم فيه استخدام مدير ذاكرة مخصص لسيناريو حيث لم يكن Malloc () كافيًا تطبيقًا حيث أنتجت سجلات الاختبار المتغيرة طولها سجلات نتائج متغيرة طولها (والتي قد تكون أطول أو أقصر) ؛ التطبيق اللازم لدعم نتائج جلب وإضافة المزيد من الاختبارات في منتصف المركز. تم تخزين الاختبارات في عناوين متزايدة بدءًا من أسفل المخزن المؤقت ، في حين تم تخزين النتائج في تناقص العناوين التي تبدأ من الأعلى. كمهمة خلفية ، سيتم نسخ الاختبارات بعد الإصدار الحالي إلى بداية المخزن المؤقت (نظرًا لوجود مؤشر واحد فقط تم استخدامه لقراءة الاختبارات للمعالجة ، فإن منطق النسخ سيقوم بتحديث هذا المؤشر كما هو مطلوب). لو أن التطبيق يستخدم malloc/free ، فمن المحتمل أن يكون تشابك التخصيصات للاختبارات والنتائج قد يكون لها ذاكرة مجزأة ، ولكن مع استخدام النظام لم يكن هناك مثل هذا المخاطر.

هناك تطبيق تجمع الذاكرة البسيط نسبيًا في ccan:

http://ccodearchive.net/info/antithread/alloc.html

هذا يبدو وكأنه يناسب فاتورتك. بالتأكيد، altoc.c هو 1230 سطرًا ، ولكن جزءًا كبيرًا من ذلك هو رمز الاختبار والمعالجة. إنه أكثر تعقيدًا قليلاً من الكود الذي قمت بتطبيقه ، لكن تخصيص الذاكرة اللائق معقد.

صدى النصيحة لقياس أولاً ومتخصصة فقط إذا كان الأداء تمتص - يجب أن يكون من السهل تجريد Malloc/Free/RealLocs بحيث يكون الاستبدال واضحًا.

بالنظر إلى المنصة المتخصصة ، لا يمكنني التعليق على فعالية أوقات التشغيل. إذا قمت بالتحقق لوكي أو هذه يستحق نظرة. الرابط الثاني لديه بعض التعليقات المثيرة للاهتمام على هذه القضية أيضًا.

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