2017-04-16 16 views
0

私はここにファンキーな問題があります。私はいくつかの簡単なタイマーでオブジェクトの作成をベンチマークします。私のコードベースは、プロトタイプからより完全なフレームワークへと徐々に移行しています。これには、いくつかのシンプルな構造体を最上位レベル(メインから)で初期化する必要があります。つまり、私はオブジェクトの初期化をベンチマークする方法を見つけることができず、これは重要です。理想的な世界ではメンバーの初期化リストからプレーンボイド関数を呼び出しますか?

、私はの線に沿って何か行うことができます:あなたがアイデアを得る

struct Potato { 
    Potato() 
     : benchmark::start() 
     , some_int(42) 
    { 
     /* Some more stuffs */ 

     benchmark::stop(); 
    } 

    int some_int; 
}; 

を、私は、ベンチマークにメンバー初期化子リストを願っています。誰もがソフトウェア全体でグローバル(静的)なオブジェクトを使ってそうする方法についてヒントを持っていますか?私はconstexpr関数を無駄に試していた。また、単純な関数からオブジェクトコレクションを返すときに、いくつかのコピーコンストラクターの問題(make_tupleから)を取得します。

ご協力ありがとうございます。

答えて

1

コンストラクタがbenchmark::start()を呼び出すようにベンチマークのラッパー構造を作成するだけで、Patatoのコンストラクタ本体で手動で停止させます。しかし、ラッパー・インスタンスがPatatoの最初のオブジェクトであることを確認する必要があります(これはC++のメンバー初期化順序を利用します)。イラスト:

struct Benchmarker{ 
    Benchmarker(){ benchmark::start(); } 
}; 

struct Potato { 
    Potato() 
     : //Benchmark's ctor will be implicitly called first 
      some_int(42) 
    { 
     benchmark::stop(); 
    } 

    Benchmarker benchmark; //NOTE: Make sure its the first 
    int some_int; 
}; 
+0

ニース!どうも。私はこれも面白いhttp://stackoverflow.com/questions/17375114/c-temporary-variables-in-initilization-listであることがわかりました。両方のミックスは私が信じるトリックを行うべきであり、振る舞いをオフにする何らかの定義が必要です。良い日:) – scx

+1

私的継承も有用かもしれません(継承ベンチマークの場合)。 – Jarod42

関連する問題