【发布时间】:2011-07-20 15:53:06
【问题描述】:
我有一些看起来像这样的代码:
ComplexObject cpy;
{
RAIILockObject _(obj->mutex);
cpy = obj->org;
}
// use cpy
为了论证,假设ComplexObject 的默认构造函数开销很大。
- C++ 编译器可以(并且可以)用复制构造函数替换 cpy 的默认构造/赋值吗?
- 有什么方法可以重构代码以强制进行优化,同时保留两个本地对象的范围?
编辑:我真的在寻找一个通用的解决方案来解决希望将 RAII 对象与其他事物不正确嵌套的问题。
任何 cmet 对此采取 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
【问题讨论】:
-
该死,我刚刚意识到如果复制本身很关键,我的解决方案将无法正常工作。如果不是(请澄清!),那么您的代码毫无意义。
-
@Konrad:对于我正在查看的案例类型,默认构造函数/赋值操作符对与复制构造函数相同,因此您的解决方案是有效的。但是,我感兴趣的是编译器实际上并不知道它的情况。
标签: c++ optimization raii scoping