私は、メソッドの実行に要する時間を測定して、アプリケーションのパフォーマンスを調べる統計マネージャーを持っています。その使用法は次のようなものです:MyClass(expr)のスコープの違い。 MyClass myObject(expr);
myStatManager.StartStat("Rendering");
Render();
myStatManager.StopStat("Rendering");
出力方法は、その方法がどれぐらいかかったかを教えてくれます。
私は便宜上、オブジェクトが作成され破棄されるときにこれらの2つのメソッドを呼び出すダミーオブジェクトを作成しました。これにより、C++のスコープルールを自分の都合に合わせて使用することができ、上記の2回ではなく1回だけ統計追跡ラインを入力することができます。
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);の違いについてのもので、答えは最初のケースの一時変数に関するものです。潜在的な重複は一時的な人生の生涯を特に求めています。 – TooTone