2011-07-17 16 views
2

私は、メソッドの実行に要する時間を測定して、アプリケーションのパフォーマンスを調べる統計マネージャーを持っています。その使用法は次のようなものです: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++がこのように書かれている理由は誰にも分かりますか?一時的な変数は、すぐに破棄されるとはどういう意味ですか?

+0

私はそれらが関連していると思いますが、重複はありません。この質問は 'MyClass(expr);と' MyClass myObject(expr);の違いについてのもので、答えは最初のケースの一時変数に関するものです。潜在的な重複は一時的な人生の生涯を特に求めています。 – TooTone

答えて

1

すぐに範囲外のtempオブジェクトを作成しました。つまり、次の行の実行が開始されます。レンダリングの前に開始と停止が行われるようにします。

3

オブジェクトの識別子を使用しない場合は、一時オブジェクトになり、それが属する式が終了した後で破棄されます。言い換えれば、それはその単一の表現の範囲を持っています。

ブラケットスコープの終わりまでライブになるようにオブジェクトの名前を付ける必要があります。

ScopedStat stat("Rendering"); 
4
{ 
    ScopedStat("Rendering"); 
    Render(); 
} 

しかし、これはおそらく、コンパイラまたは何かがScopedStatが出てオブジェクト 最適化しているように、動作しません。報告された時間は、ミリ秒の割合である で、レンダリングにかかる​​時間はどこにもありません。 私の質問は、なぜこの方法ではうまくいかないのですか?このオブジェクトはスコープの終わりに が破壊されないのですか?

名前のない通常の変数を作成しているわけではありません。 を一時的に作成し、それが宣言されたfull-expressionの最後に存在しなくなります。(Render()が呼び出される前に、それはScopedStatが既に来てしまった、ある。)あなたははそれに名前を付けるがあるでしょう

。限り、ちょうどいいですdoFooへの呼び出しが行うように

doFoo(ScopedStat("Rendering")); 

一時的な生活:


があなたの最後の質問に答えるために、これはあなたのような何かを完璧な意味があります。

関連する問題