假设有两个类的层次结构(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 就可以了 - 执行快速路径
- 如果需要,在现有
Base
实例上调用Derived
ctor 并执行慢速路径
在 C++ 中可以吗?如果没有,有什么可能的解决方法?显然,我正在尝试优化速度。
最佳答案
恐怕这不可能就像你写的那样 - Derived
必须的任何构造函数调用 Base
子对象的构造函数,所以合法地做到这一点的唯一方法是首先调用 Base
的析构函数,我相信你不希望这样。
然而,通过轻微的重新设计应该很容易解决这个问题 - 更喜欢组合而不是继承,并使 Derived
成为一个单独的类来存储引用(在一般意义上;它当然可以是一个指针)到 Base
并使用它。如果访问控制是一个问题,我觉得 friend
在这里是合理的。
关于c++ - 逐步构造一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22191589/