На конструкциях
Логически нет никакой разницы между ними:
В обоих случаях стек делается достаточно большим, чтобы вместить объект, и для объекта вызывается конструктор.
Просто обратите внимание:
- Конструктор для типа POD ничего не делает.
- Пользовательский тип без конструктора имеет сгенерированный компилятором cosntructor по умолчанию.
Вы можете думать об этом так:
int x; // stack frame increased by sizeof(int) default construct (do nothing)
B a; // stack frame increased by sizeof(B) default construct.
В то время как:
int y(6); // stack frame increased by sizeof(int) Copy constructor called
B b(a); // stack frame increased by sizeof(B) Copy constructor called
Ok. Конечно, конструктор для типов POD очень тривиален, и компилятор выполнит много оптимизаций (и может практически удалить любой реальный код и даже адрес памяти), но логически вполне нормально думать, что он счастлив таким образом.
Примечание: у всех типов есть конструктор копирования (если вы этого не сделаете, компилятор определяет его) и типы POD, которые вы можете логически рассматривать как конструкцию копирования без каких-либо проблем.
Что касается виртуальных таблиц:
Позвольте мне сначала отметить, что это детали реализации, и не все компиляторы используют их.
Но сам vtable обычно генерируется во время компиляции. Любой объект, которому требуется vtable, имеет невидимый указатель, добавленный к структуре (это включено как часть размера объектов). Затем во время конструирования указатель устанавливается на виртуальную таблицу.
Примечание: невозможно определить, когда vtable установлен, поскольку это не определено стандартом, и, таким образом, каждый компилятор может сделать это в любое время. Если у вас многоуровневая иерархия, тогда vtable, вероятно, устанавливается каждым конструктором от базового до самого производного и, следовательно, вероятно, ошибочен, пока не завершится финальный конструктор.
Примечание: Вы не можете вызывать виртуальные функции в конструкторе / деструкторе. Поэтому все, что вы можете сказать, это то, что vtable будет правильно инициализирован только после полного завершения конструктора.