【发布时间】:2011-10-07 07:13:28
【问题描述】:
我有一个统计管理器,它通过测量方法执行所需的时间来检查我的应用程序性能。它的用法是这样的:
myStatManager.StartStat("Rendering");
Render();
myStatManager.StopStat("Rendering");
屏幕的输出将告诉我该方法花费了多长时间。
为方便起见,我编写了一个虚拟对象,在创建和销毁对象时调用这两个方法。这使我可以充分利用 C++ 范围规则,并且只键入一次统计跟踪行,而不是上面的两次。
class ScopedStat
{
string label;
ScopedStat(string inLabel): label(inLabel) { myStatManager.StartStat(label); }
~ScopedStat() { myStatManager.StopStat(label); }
}
预期用法如下:
{
ScopedStat("Rendering");
Render();
}
但是,这不起作用,因为编译器或其他东西可能已经优化了 ScopedStat 对象。报告的时间只有几分之一毫秒,远不及渲染所需的时间。我的问题是,为什么这种方式不起作用?这个对象在作用域结束时不会被销毁吗?
编辑:我找到了解决方法:
{
ScopedStat ss("Rendering");
Render();
}
这按预期工作-对象仅在大括号末尾被销毁。不过,我还是想知道为什么。
注意:使用 Microsoft Visual Studio 2008 C++;
Edit2:啊,我现在明白了,除非我将我的对象绑定到一个变量,否则它会在计算表达式后被销毁。感谢你的帮助。
有人知道为什么 C++ 是这样写的吗?临时变量立即销毁有什么用?
【问题讨论】:
-
我认为它们是相关的,但不是重复的。这个问题是关于
MyClass(expr);和MyClass myObject(expr);之间的区别,答案是关于第一种情况的临时变量。而潜在的重复是专门询问临时工的生命周期。
标签: c++ object constructor scope