Затраты на наследование в C ++ - PullRequest
9 голосов
/ 07 июля 2010

В качестве примера взят следующий фрагмент:

struct Foo
{
  typedef int type;
};

class Bar : private Foo
{
};

class Baz
{
};

Как видите, в этих отношениях нет виртуальных функций. Поскольку это так, являются ли следующие предположения точными в том, что касается языка?

  • Таблица виртуальных функций не будет создана в Bar.
  • sizeof(Bar) == sizeof(Baz)

По сути, я пытаюсь выяснить, буду ли я платить какие-либо штрафы за это. Мое первоначальное тестирование (хотя и на одном компиляторе) показывает, что мои утверждения верны, но я не уверен, что это оптимизатор моего компилятора или спецификация языка, которая отвечает за то, что я вижу.

Ответы [ 3 ]

10 голосов
/ 07 июля 2010

В соответствии со стандартом Bar не является типом POD (обычные старые данные), потому что у него есть база.В результате, стандарт предоставляет компиляторам C ++ большую свободу действий по сравнению с тем, что они делают с таким типом.

Однако очень немногие компиляторы собираются делать что-то безумное здесь.Одна вещь, которую вы, вероятно, должны обратить внимание, это Оптимизация пустых баз.По различным техническим причинам стандарт C ++ требует, чтобы любому экземпляру было выделено место для хранения.Для некоторых компиляторов Foo будет выделено выделенное пространство в классе bar.Однако компиляторы, которые реализуют Оптимизацию пустой базы (чаще всего в современном использовании), удаляют пустую базу.

Если данный компилятор не реализует EBO, то sizeof(foo) будет как минимум вдвое больше sizeof(baz).

1 голос
/ 07 июля 2010

Да, без каких-либо виртуальных членов или переменных-членов не должно быть разницы в размерах.

0 голосов
/ 07 июля 2010

Насколько я знаю, компилятор будет оптимизировать это правильно, если вообще потребуется какая-либо оптимизация.

...