Затраты на наследование в C++

Взятие следующего отрывка как пример:

struct Foo
{
  typedef int type;
};

class Bar : private Foo
{
};

class Baz
{
};

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

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

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

9
задан tshepang 12 May 2014 в 09:50
поделиться

3 ответа

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

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

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

10
ответ дан 3 November 2019 в 00:58
поделиться

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

0
ответ дан 3 November 2019 в 00:58
поделиться

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

1
ответ дан 3 November 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: