为什么gcc会立即销毁我的对象,尽管它有作用域?(我怎样才能让它不这样做呢?)
Why is gcc destroying my object instantly despite its scope? (and how do I make it not do that?)
我写了一个小的分析类,附带一个守卫类,像这样使用:
{
ProfileGuard pg("SampleName");
// Code to profile
...
}
但后来我注意到,有时gcc优化代码,使pg
立即被销毁。显然,它检测到pg
和其他代码不会相互影响。防止gcc这样做的最好方法是什么?
更新:由于对我的问题有一些严重的怀疑,我将再次检查我的代码。我的问题基于:
3.7.3 3。
如果具有自动存储持续时间的变量具有初始化或具有副作用的析构函数,则不应使用它在它的块结束之前被销毁,也不能作为一个优化被消除,即使它看起来是未被使用,除非类对象或其复制/移动可以像12.8中指定的那样被消除。
打印是"副作用"吗?
显然它检测到pg和其他代码不会相互影响。
既然那显然是不真实的,怎么可能呢?它们确实相互影响(例如通过输出顺序)。
GCC不这样做。也许您不小心使用了匿名(因此是临时的)对象?
ProfileGuard("SampleName");
现在,这个将在执行表达式后立即被销毁。
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 为什么C++的文件 I/O 在读取文本文件时忽略初始空行?我怎样才能让它不这样做?
- 为什么在C++中对链表这样做?(像堆叠一样处理它们)
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- C++循环、作用域和堆栈(为什么这样做?
- 作用域中的范围,做还是不做?
- GetCurrentConsoleFont没有在作用域中声明,我做错了什么
- 为什么gcc会立即销毁我的对象,尽管它有作用域?(我怎样才能让它不这样做呢?)
- 变量是否可以仅在 if 语句的作用域中定义,类似于通常为 for 循环所做的那样?
- 为什么我不能在函数中使用constexpr值,但我可以在这个值的作用域内做同样的事情