Вопрос

Скомпилируйте следующий класс

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

inline Interface::~Interface() {}

используя gcc -fdump-class-hierarchy.

gcc излучает

Class Interface
   size=4 align=4
   base size=4 base align=4
Interface (0x1a779c0) 0 nearly-empty
    vptr=((& Interface::_ZTV9Interface) + 8u)

В чем значение слова "почти пустой"?Что это значит?

Это было полезно?

Решение

В C++ ABI содержит определение "почти пустых" классов и интересное обсуждение того, как они влияют на построение vtable:

Класс, который содержит виртуальный указатель, но никаких других данных, кроме (возможно) виртуальных баз.В частности, это:

  • не содержит нестатических элементов данных, отличных от битовых полей нулевой ширины,
  • не имеет прямых базовых классов, которые не являются ни пустыми, ни почти пустыми, ни виртуальными,
  • имеет не более одного невиртуального, почти пустого прямого базового класса и
  • не имеет надлежащего базового класса, который был бы пустым, морально не виртуальным и со смещением, отличным от нуля.

Я столкнулся с этим, исследуя влияние почти пустых виртуальных баз на размер объекта, размер vtable и накладные расходы на виртуальные вызовы.

Другие советы

Я полагаю, это для того, чтобы отличить его от "пустого", что вы получите, если скомпилируете класс вообще без членов."почти пустой", по-видимому, означает, что в нем есть vtable и ничего больше.

В C ++ есть нечто, называемое "оптимизация пустой базы".Если у класса нет членов, ему не нужно занимать место, когда он используется в качестве базового класса.Примером того, почему это важно, является std::unary_function<T, U>.Он существует для того, чтобы предоставить вам простой набор typedefs.Эти typedefs не должны влиять на размер вашего класса functor.

Если у вас есть базовый класс с указателем vtable, этот указатель, скорее всего, может быть общим с производным классом.Вы просто создаете vtable для производного класса, который добавляет свои собственные методы после методов базового класса.

Теперь вы можете создать аналогичный базовый класс "без дополнительных накладных расходов".Очевидно, GCC называет это "почти пустым".

В нем есть только vtable, без полей данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top