gpt4 book ai didi

c++ - C++ 中变量作用域的嵌套不正确?

转载 作者:太空狗 更新时间:2023-10-29 23:47:12 29 4
gpt4 key购买 nike

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

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:

原始代码有这样的顺序:

  1. 默认构造cpy
  2. 构造RAII lock
  3. 将现有对象分配(复制)到cpy
  4. 销毁
  5. 使用cpy
  6. 销毁cpy

我想要的是:

  1. 构造RAII lock
  2. 构造cpy(在本例中是使用现有对象的复制构造函数)。
  3. 销毁
  4. 使用cpy
  5. 销毁cpy

最佳答案

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

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

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

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

关于c++ - C++ 中变量作用域的嵌套不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6764787/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com