c++ - 逐步构造一个对象

标签 c++

假设有两个类的层次结构(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/

相关文章:

c++ - Eigen 也可以用于 1- vector (标量)吗?

c++ - 使用 Netbeans 在 C++ 中包含 <string>

c++ - 如何根据 initializer_list 的大小导致编译时错误?

c++ - MFC 一个父对话框,多个子对话框

c++ - distcc 问题 : does it really speeds up compilation?

c# - 没有垃圾收集的 .NET 的强大功能?

c++ - 是否有任何内置函数来检查给定的两个数字在给定整数数组中的顺序是否相同?

c++ - 检查对象数组中的 'null' 槽

c++ void *到函数的参数

c++ - 最烦解析更烦