Взятие следующего отрывка как пример:
struct Foo
{
typedef int type;
};
class Bar : private Foo
{
};
class Baz
{
};
Как Вы видите, никакие виртуальные функции не существуют в этих отношениях. С тех пор дело обстоит так, следующие предположения, точные, что касается языка?
Bar
.sizeof(Bar) == sizeof(Baz)
В основном я пытаюсь выяснить, буду ли я платить какой-либо вид штрафа за то, что сделали это. Мое тестирование начальной буквы (хотя на единственном компиляторе) указывает, что мои утверждения допустимы, но я не уверен, является ли это оптимизатором моего компилятора или спецификацией языка, это ответственно за то, что я вижу.
Согласно стандарту, Bar не является типом POD (plain old data), потому что у него есть база. В результате, стандарт предоставляет компиляторам C++ широкую свободу действий в отношении того, что они делают с таким типом.
Однако очень немногие компиляторы сделают здесь что-то безумное. Единственное, на что вам, вероятно, придется обратить внимание, это оптимизация пустой базы. По различным техническим причинам стандарт C++ требует, чтобы любому экземпляру было выделено место для хранения. В некоторых компиляторах для Foo будет выделено специальное место в классе bar
. Однако компиляторы, реализующие оптимизацию пустой базы (большинство современных), удалят пустую базу.
Если данный компилятор не реализует EBO, то sizeof(foo)
будет как минимум вдвое больше sizeof(baz)
.
Насколько я знаю, компилятор оптимизирует это правильно, если вообще нужна оптимизация.
Да, без каких-либо виртуальных членов или переменных-членов не должно быть разницы в размере.