C++ 优化器删除具有副作用的对象

C++ optimizer removal of object with side effects

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

我有代码块

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

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

我的问题是,是否有任何我需要做的事情,比如声明某些东西为 volatile 或设置一些公共属性以防止优化器将 myObj 检测为未使用的变量等。

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

只要您使用的编译器稍微符合标准(我看的是 Turbo C++)。这不是问题,因为该标准对构造和破坏做出了强有力的保证。这些保证是 RAII 的基础,也是 "Modern" c++ 风格的基础。

除了 RVO (return value optimization), optimization is not allowed to change the observable behaviour of the program. Optimizations must follow the so called "as-if" rule.

这样明确定义的情况