我有一些看起来像这样的代码:
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