为什么gcc会尽快摧毁我的物体?(如何让它不这样做?)

tau*_*ran 2 c++ optimization gcc destructor raii

我写了一个小的分析类,附带一个防护类,使用如下:

{
    ProfileGuard pg("SampleName");

    // Code to profile
    ...
}
Run Code Online (Sandbox Code Playgroud)

但后来我注意到gcc有时会优化代码,以便pg立即被破坏.显然它会检测到,pg其他代码不会影响彼此.阻止gcc这样做的最佳方法是什么?

更新: 由于对我的问题有一些严重的怀疑,我会再次检查我的代码.我的问题基于:

3.7.3 3.

如果具有自动存储持续时间的变量具有初始化或具有副作用的析构函数,则不应在其块结束之前销毁它,也不应将其作为优化消除,即使它看起来是未使用的,除了类对象或其复制/移动可以按照12.8的规定予以删除.

打印是否有"副作用"?

Kon*_*lph 10

显然它检测到pg和其他代码不会相互影响.

怎么样,因为那显然是不真实的?它们确实相互影响(例如通过输出顺序).

海湾合作委员会不这样做.也许你不小心使用了一个匿名(因此是临时的)对象?

ProfileGuard("SampleName");
Run Code Online (Sandbox Code Playgroud)

现在,这在执行表达式后立即被破坏.

  • 我有点惭愧但是`ProfileGuard("SampleName");`正是发生了什么:) (5认同)