【问题标题】:C++ optimizer removal of object with side effectsC ++优化器删除具有副作用的对象
【发布时间】:2015-08-12 17:09:55
【问题描述】:

目前这不是问题,但我担心代码是否被移植或我们更改编译器。

我有一个带有块的代码

{ 
   MyClass myObj;
   // copy some other variables but never touch myObj
   .
   .
} // expect destructor to be called on myObj

myObj 从未在块代码中使用,但构造函数有副作用,我依赖 MyClass 的析构函数代码在块结束时执行。这在我当前的 arm 编译器上按预期工作,并打开了一些优化。

我的问题是,我需要做些什么,比如声明一些 volatile 或设置一些通用属性以防止优化器将 myObj 检测为未使用的变量等。

这不是 C++11 编译器。正如我所说,这目前不是问题,但我不想给其他人留下一个奇怪的未来错误。

【问题讨论】:

标签: c++ optimization raii side-effects


【解决方案1】:

除了像RVO (return value optimization) 这样明确定义的情况外,不允许优化来改变程序的可观察行为。优化必须遵循所谓的"as-if" rule

【讨论】:

  • 我不知道 RVO,但是复制构造函数中的副作用的想法本身就很可怕,因为它们通常作为析构函数隐藏起来。谢谢。
【解决方案2】:

就您使用的编译器而言,它甚至略微符合标准(我在看您的 Turbo C++)。这不是问题,因为该标准对构造和破坏做出了强有力的保证。这些保证是RAII 的基础,它是“现代”c++ 风格的基础。

【讨论】:

  • 是的,那是我以为我记得的,但我记不起理性了。谢谢
  • @bd2357 这些保证也是 UB 使用 goto 跳过对象构造的原因。
  • 跳过对象初始化不是未定义的行为,它的格式不正确。
  • @BenjaminLindley 是的,遗憾的是我的评论编辑时间已经用完了。更糟糕的是……根据我的经验,一些编译器允许这样做。
  • 转到?我不知道你说的是哪个。 :)
猜你喜欢
  • 1970-01-01
  • 2018-11-02
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
相关资源
最近更新 更多