أداء تخصيص مترجم من الذاكرة على كومة من أحجام مختلفة

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

سؤال

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

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

إليك مثال لإظهار هذا:

void f(){
    int32_t a, b;
    //something happens to a and b...
    int64_t c;
    //something happens to c...
}

هناك عدد قليل من الافتراضات لجعل هنا لغرض المثال ... أن المتغيرات غير محسنة، ولم تعد B وغير مفيدة بمجرد تحديد C ويتم تخصيص جميع المتغيرات لذاكرة المكدس. من الواضح أنني أريد "C" استخدام نفس الذاكرة مثل "A" و "B" المستخدمة للتو وتخصيص 8 بايت فقط، ولكن الإصدار الحالي من برنامج التحويل البرمجي الخاص بي ستخصيص 16 بايت كامل 16 بايت.

سؤالي هو، كيف يمكنني تخصيص المتغيرات في ذكرى أحجام مختلفة بكفاءة؟

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

المحلول

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

لماذا لا توسعها للقيام بذلك فقط؟ أو، أفضل تقسيم أو فئة فرعية أفضل لتخصيص التسجيل والمكدس مباشرة.

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

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