我有一些看起来像这样的代码:
ComplexObject cpy;
{
RAIILockObject _(obj->mutex);
cpy = obj->org;
}
// use cpy
为了论证,假定
ComplexObject
的默认构造函数很昂贵。编辑:我真的在寻找一种通用的解决方案,以解决RAII对象与其他事物不正确嵌套的问题。
对此Konrad Rudolph解决方案有何评论?
ComplexObject = LockedInitInPlace(obj->org, obj->mutex);
template<class C> C LockedInitInPlace(C& c, Mutex& m) {
RAIILockObject _(m);
return c;
}
编辑2:
原始代码具有以下顺序:
cpy
lock
cpy
lock
cpy
cpy
我想要的是:
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.