النفقات العامة من الميراث C ++ مع عدم وجود وظائف افتراضية

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

سؤال

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

class a
{
public:
    void get();
protected:
    int _px;
}

class b : public a
{

}

مقارنة مع

class a
{
public:
    void get();
protected:
    int _px;
}

class b
{
public:
    void get();
protected:
    int _px;

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

المحلول

قد يكون هناك نفقات ذاكرة خفيفة (بسبب الحشو) عند استخدام الوراثة مقارنة بالنسخ والماضي، فكر في التعريفات الفئة التالية:

struct A
{
  int i;
  char c1;
};

struct B1 : A
{
  char c2;
};


struct B2
{
  int i;
  char c1;
  char c2;
};

ربما ستكون Sizeof (B1) 12، في حين أن Sizeof (B2) قد تكون 8.

نصائح أخرى

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

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

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

سيقوم المحول البرمجي بإنشاء مكالمة مباشرة إلى التعليمات البرمجية التي تنفذ كل وظيفة عضو غير افتراضية، وبالتالي لا يوجد في النفقات العامة.

ليس حقا، فقد زاد فقط من الذاكرة من خلال الفئة الأساسية. يمكنك قراءة المزيد في هنا في C ++ الأسئلة الشائعة

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