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

时间:2015-05-29 18:06:36

标签: c++ optimization raii side-effects

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

我有一个块的代码

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

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

我的问题是,我是否需要做任何事情,例如声明易失性或设置一些公共属性以防止优化器将myObj检测为未使用的变量或其他类似物。

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

2 个答案:

答案 0 :(得分:3)

除明确定义的案例如RVO (return value optimization)外,不允许优化更改程序的可观察行为。优化必须遵循所谓的"as-if" rule

答案 1 :(得分:2)

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