استخدام دفعة في نظام جزءا لا يتجزأ من الذاكرة القيد

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

سؤال

نحن باستخدام c++ إلى تطوير تطبيق يعمل في Windows CE 4 على نظام مضمن.

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

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

أي تعليقات و/أو المشورة هي موضع ترحيب!

شكرا جزيلا ،

Nic

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

المحلول

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

نصائح أخرى

نحن نستخدم تعزيز النظم المضمنة.مع دفعة يمكنك انتقاء واختيار ما كنت تستخدم.نستخدم smart_ptr و boost::bind في جميع مشاريعنا.نكتب برنامج الهواتف المحمولة الرخيصة.و إذا كان Windows CE يمكن تشغيلها على الأجهزة الخاصة بك أتوقع أن أجزاء من دفعة تكون قابلة للتطبيق.هناك أجزاء من دفعة لا تخصيص و قد تجد من المفيد لهم.

أود أن انتقاء واختيار على أساس الاحتياجات الخاصة بك.

مثل أي شيء التي يمكنك استخدامها ، عليك أن تعرف التكاليف.

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

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

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

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

لا تستخدم دفعة.

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

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

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

أنا أبحث في هذا الآن — أود أن استخدام مخازن دائرية, قفل حاويات مجانية و غير متزامن I/O, و بدلا من تخصيص الذاكرة الديناميكية كنت تفضل استخدام الذاكرة حمامات.

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

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

أتمنى شخص ما يشير لماذا أنا الخاطئ عن هذا.

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