gpt4 book ai didi

c++ - MyClass(expr) 之间的范围差异;和 MyClass myObject(expr);

转载 作者:搜寻专家 更新时间:2023-10-30 23:48:27 24 4
gpt4 key购买 nike

<分区>

我有一个统计管理器,它通过测量方法执行所需的时间来检查我的应用程序性能。它的用法是这样的:

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:啊,我现在明白了,除非我将我的对象绑定(bind)到一个变量,否则它会在表达式求值后被销毁。感谢你的帮助。

有谁知道C++为什么这么写?如果立即销毁,临时变量有什么用?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com