تغيير حجم المخزن المؤقت باستخدام RealLoc

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

  •  16-09-2019
  •  | 
  •  

سؤال

إذا تمت نقل المنطقة إلى تم نقلها، فسيتم إجراء مجاني (PTR).

هل يمكن أن توضح الخط أعلاه realloc()ب هذا الخط من صفحة رجل لل Caloc، Malloc، Reallec وحرة.

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

المحلول

أعتقد أن هذا يفسر أنه أفضل:

إذا كانت المساحة الكافية غير موجودة لتوسيع الكتلة الحالية في موقعها الحالي، يتم تخصيص كتلة جديدة من حجم الحجم، ويتم نسخ البيانات الموجودة من الكتلة القديمة إلى بداية الكتلة الجديدة. يتم تحرير الكتلة القديمة، وترجع الدالة إلى المؤشر إلى الكتلة الجديدة.

مرجع مأخوذ من RealLoc في C.

نصائح أخرى

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

Addr       A                   B
     +------------+      +------------+
1000 | your space |      | your space |
     +------------+      +------------+
2000 | free space |      | used space |          
     |            |      +------------+
3000 |            |      | free space |
     |            |      |            |
4000 |            |      |            |
     +------------+      +------------+

في كلتا الحالتين، لديك 1000 بايت مخصصة في العنوان 1000. ومع ذلك، في وضع B، يتبع ذلك على الفور الذاكرة المخصصة لبعض الأغراض الأخرى.

دعونا نعلم ما يحدث عندما تريد إعادة تخصيص ذاكرتك إلى 2000 بايت.

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

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

Addr       A                   B
     +------------+      +------------+
1000 | your space |      | free space |
     |            |      +------------+
2000 |            |      | used space |
     +------------+      +------------+
3000 | free space |      | your space |
     |            |      |            |
4000 |            |      |            |
     +------------+      +------------+

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

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

  • هناك مساحة حرة بعد ذلك، جنبا إلى جنب مع المساحة الحالية، يمكن أن تلبي إعادة التوزيع؛ أو
  • أنت تقلل من الحجم.

لا يمكنك دائما زراعة منطقة الذاكرة فقط في الموقع. قد لا يكون هناك مجال في كومة الكومة. لذلك بدلا من تنموه، فإنه سيخصص كتلة ذاكرة جديدة تماما وتحرير الذاكرة القديمة.

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