سؤال

لدي تطبيق Delphi كبير وأحاول الحفاظ على انخفاض بصمة الذاكرة.

في برنامجي ، أستخدم مكونًا (TACO) ومكونًا (Tburrito) يرث من تاكو. الآن فقط فيما يتعلق باستخدام ذاكرة الفئات وليس الحالات الفعلية ، أي سيناريو يستخدم المزيد من الذاكرة؟

أ. فقط باستخدام مكون Tburrito في كل مكان

أو

ب. باستخدام مزيج من مكونات تاكو و Tburrito؟

فكرتي الوحيدة هي أنه نظرًا لأن Tburrito يرث Taco ، فإن Taco Class يتم تخزينه بالفعل في الذاكرة وبالتالي فإن استخدامه لن يزيد من انبعاث الذاكرة كثيرًا.

*ملاحظة - أسماء المكونات ليست حقًا تاكو وبوريتو.

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

المحلول

كل مثال Burrito سوف تشغل ما لا يقل عن الذاكرة مثل مثيل Taco. طرح او خصم Taco.InstanceSize من Burrito.InstanceSize لمعرفة مقدار ما.

استخدام Burrito على وجه الحصر لن يوفر لك أي ذاكرة ؛ تعريف Taco سيظل موجودًا ، حتى لو لم يكن لديك حالات من هذا الفصل بالضبط ، لأنه على الأقل ، Burrito.ParentClass لا يزال يحتاج إلى الرجوع إليها.

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

نصائح أخرى

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

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