سؤال

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

سيكون المخطط الخام هو تخصيص كتل بدءا من أدنى عنوان ذاكرة يسير لأعلى وحفظ معلومات حفظ المكوك بدءا من أعلى عنوان ذاكرة يعمل إلى أسفل.

سيقوم مدير الذاكرة بمرور المؤشرات الذكية - يبدو زيادة تدخلية_ptr أكثر وضوحا لبيدات حفظ الكتب التي من شأنها أن تشير أنفسهم إلى كتلة الذاكرة الفعلية وبالتالي إعطاء مستوى غير مباشر بحيث يمكن نقل الكتل بسهولة.

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

التطبيق المحدد لهذه هي برمجة لعبة وحدة التحكم، وهكذا في بداية أو نهاية كل إطار يمكن إجراء تمرير defrag نسبيا.

لذلك فإن سؤالي يستخدم هذا النوع من مخطط التخصيص مجتمعا مع STL هل ستنفذ تماما STL بعيدا كما أظن. أستطيع أن أرى STD :: قائمة <تدخلية_ptr> تعمل على مستوى تدخلية_PTR ولكن ماذا عن تخصيص قائمة قائمة STL أنفسها موجودة على أي حال لتجاوز المؤشرات التالية / السابقة لتكون تدخلية_PTR أنفسهم أو أنا سأضطر إلى أن يكون لدي مخصص الكومة القياسية جنبا إلى جنب هذا أكثر ديناميكية واحدة.

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

المحلول

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

السبب هو أن نموذج C ++ بالكامل يعتمد على الكائنات التي تجلس عند النقاط الثابتة في الذاكرة، لذلك إذا كان مؤشر ترابط هو استدعاء طريقة على كائن، تم إيقاف هذا الخيط مؤقتا وانتقل الكائن، وستضرب الكارثة عند استئناف الخيط.

لن يعمل أي كائن الذي عقد مؤشر ذاكرة خام كائن آخر قد يتم نقله (بما في ذلك كائن فرعي لنفسه).

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

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

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

نصائح أخرى

يتم تطبيق حاويات STL باستخدام مؤشرات عارية.

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

بدلا من ذلك، قد تفكر في تنفيذ مجموعة فرعية من STL بنفسك: ثم يتم بعد ذلك تنفيذ إصداراتك من حاويات STL مع المؤشرات المدارة.

تقنية بديلة معروفة جيدا إلى حد ما هي نظام الأصدقاء. وبعد يجب أن نلقي نظرة على ذلك للإلهام الإضافي.

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

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

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

التعليق مرة أخرى على كيفية كل شيء يتحول.

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