سؤال

ترجمة الطبقة التالية

class Interface
{
  virtual void doIt() = 0;
  virtual ~Interface() = 0;
};

inline Interface::~Interface() {}

استخدام gcc -fdump-class-hierarchy.

gcc تنبعث منه

حجم واجهة الطبقة = 4 محاذاة = 4 قاعدة الحجم = 4 قاعدة محاذاة = 4 واجهة (0x1a779c0) 0 تقريبا-vptr = ((& واجهة :: _ _ ztv9interface) + 8u)

ما أهمية "فارغة"؟ ماذا تعني؟

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

المحلول

ال C ++ أبي. يوفر تعريف الفصول "فارغة" تقريبا ومناقشة مثيرة للاهتمام حول كيفية تأثيرها على البناء VTable:

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

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

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

نصائح أخرى

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

يحتوي C ++ شيء يسمى "تحسين قاعدة فارغة". إذا لم يكن لدى الفصل أي أعضاء، فلا يحتاج إلى تناول مساحة عندما يتم استخدامها كصف أساسي. مثال على سبب هذا مهم std::unary_function<T, U>. وبعد إنه موجود لتزويدك بمجموعة سهلة من TypeDefs. يجب ألا تسهم تلك المطبوخة في حجم فئة Functor الخاصة بك.

إذا كان لديك فئة أساسية مع مؤشر Vtable، فمن المحتمل أن يتم مشاركة هذا المؤشر مع الفئة المشتقة. يمكنك ببساطة إنشاء Vtable للفئة المشتقة التي تضيف أساليبها الخاصة بعد ذلك من الفئة الأساسية.

يمكنك الآن تحقيق فئة أساسية "لا توجد علوية إضافية إضافية". يبدو أن دول مجلس التعاون الخليجي على ما يبدو "فارغ تقريبا".

لديها فقط حقول VTable، لا توجد حقول البيانات.

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