我有一些看起来像这样的代码:

ComplexObject cpy;
{
  RAIILockObject _(obj->mutex);
  cpy = obj->org;
}
// use cpy

为了论证,假定ComplexObject的默认构造函数很昂贵。
  • C++编译器可以(也可以)用复制构造函数替换cpy的默认构造/赋值吗?
  • 是否有任何方法可以重组代码,以在保留两个本地对象范围的同时强制进行优化?


  • 编辑:我真的在寻找一种通用的解决方案,以解决RAII对象与其他事物不正确嵌套的问题。

    对此Konrad Rudolph解决方案有何评论?
    ComplexObject = LockedInitInPlace(obj->org, obj->mutex);
    
    template<class C> C LockedInitInPlace(C& c, Mutex& m) {
        RAIILockObject _(m);
        return c;
    }
    

    编辑2:

    原始代码具有以下顺序:
  • 默认构造cpy
  • 构造RAII lock
  • 将现有对象分配(复制)到cpy
  • 销毁lock
  • 使用cpy
  • 销毁cpy

  • 我想要的是:
  • 构造RAII lock
  • 构造cpy(在这种情况下,使用现有对象通过拷贝构造函数进行构造)。
  • 销毁lock
  • 使用cpy
  • 销毁cpy
  • 最佳答案

    除非编译器可以自己证明这种优化会导致相同的行为,否则不会。我真的无法想象编译器可以做到这一点的情况(考虑互斥锁)。

    这听起来似乎很明显,但是您可以将默认构造函数更改为不昂贵吗?如果此类构造函数很容易被意外调用,则很可能在其他地方引起性能问题。

    或者,您将不得不使用堆和指针(通过复制构造创建),而不是本地实例。

    std::scoped_ptr<ComplexObject> cpyPtr = 0;
    {
      RIAALockObject _(obj->mutex);
      cpyPtr = new ComplexObject(obj->org);
    }
    ComplexObject& cpy = *cpyPtr;  // create alias for ease of use.
    

    09-07 07:37