c++优化器移除带有副作用的对象

C++ optimizer removal of object with side effects

本文关键字:副作用 对象 优化 c++      更新时间:2023-10-16

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

我有一个代码块

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

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

我的问题是,是否有任何事情我需要做,像声明一些易变的或设置一些共同属性,以防止优化器检测myObj作为一个未使用的变量或一些这样的。

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

除了显式定义的情况,如RVO(返回值优化),优化不允许改变程序的可观察行为。优化必须遵循所谓的"as-if"规则。

只要您使用的编译器甚至略微符合标准(我正在看您的Turbo c++)。这不是问题,因为该标准对建筑和破坏做出了强有力的保证。这些保证是RAII的基础,RAII是"现代"c++风格的基础。