Предположим, что существует иерархия из двух классов (class Derived: public Base
). Оба этих класса имеют большой объем памяти и дорогостоящие конструкторы. Обратите внимание: ничего в этих классах не выделяется в куче: они просто имеют большой sizeof
.
Тогда есть функция с быстрым путем (выполняется всегда) и медленным путем (выполняется условно). Для быстрого пути нужен экземпляр Base
, а для медленного пути требуется экземпляр Derived
, построенный из существующей базы. Кроме того, решение медленного пути может быть выполнено только после быстрого пути.
Текущий код выглядит следующим образом:
void f()
{
Base base;
/* fast path */
if (need_slow_path) {
Derived derived (base);
/* slow path */
}
}
Это неэффективно, потому что база должна быть скопирована в производную; также база распределяется дважды, и существует риск. Что я хочу иметь:
- выделить память для
Derived
экземпляра - вызов
Base
ctor на нем - выполнить быстрый путь
- при необходимости вызовите
Derived
ctor в существующий экземплярBase
и выполните медленный путь
Возможно ли это в С++? Если нет, какие возможные обходные пути? Очевидно, я пытаюсь оптимизировать скорость.