为什么gcc会立即销毁我的对象,尽管它有作用域?(我怎样才能让它不这样做呢?)

Why is gcc destroying my object instantly despite its scope? (and how do I make it not do that?)

本文关键字:这样做 作用域 gcc 我的 对象 为什么      更新时间:2023-10-16

我写了一个小的分析类,附带一个守卫类,像这样使用:

{
    ProfileGuard pg("SampleName");
    // Code to profile
    ...
}

但后来我注意到,有时gcc优化代码,使pg立即被销毁。显然,它检测到pg和其他代码不会相互影响。防止gcc这样做的最好方法是什么?

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

3.7.3 3。

如果具有自动存储持续时间的变量具有初始化或具有副作用的析构函数,则不应使用它在它的块结束之前被销毁,也不能作为一个优化被消除,即使它看起来是未被使用,除非类对象或其复制/移动可以像12.8中指定的那样被消除。

打印是"副作用"吗?

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

既然那显然是不真实的,怎么可能呢?它们确实相互影响(例如通过输出顺序)。

GCC不这样做。也许您不小心使用了匿名(因此是临时的)对象?

ProfileGuard("SampleName");

现在,这个将在执行表达式后立即被销毁。