2

C++ コンパイルでのデッド コード除去の最適化を無効にしたいと考えています。他のすべての -O 最適化を維持して、この特定の最適化を無効にする方法はありますか。-fnodce で試しましたが、うまくいきません。

更新(コメントからコピー):次のようなものがあります

timer t;
t.start();
for(int i=1;i<=1000;++i)
    object t;
t.stop();

オブジェクトの構築時間を測定したいのですがt、何もしません。1000 個のオブジェクトの配列を作成してこれを行いたくありません。これを解決する方法はありますか?

4

2 に答える 2

0

オブジェクトの初期化時間を測定したいだけなら、そもそも問題を回避するような方法でコンパイラーを書くだけでなく、DCE などを回避するようにコンパイラーに強制しようとするのはなぜでしょうか?

object *arr = new object[100];   // allocate that outside the function and pass it into it
for (int i = 0; i < 100; i++) {
    arr[i] = new object;
}

関数がインライン化を回避するのに十分な大きさである場合は、うまく機能するはずです。それ以外の場合は、関数をエクスポートして別のコンパイル モジュールから呼び出して、不要な最適化を回避できます。シンプルで、意図しない結果をもたらす可能性のあるコンパイラフラグを使用したトリックはなく、唯一のオーバーヘッドは配列ストアです-それが測定可能なタイミングに影響を与える場合、とにかく間違ったことを測定しています.

または、コンパイラ固有のフラグが本当に必要な場合 - gcc には noinline 属性があります。

于 2012-01-24T15:37:30.587 に答える
0

構築されたオブジェクトに「揮発性」修飾子を追加します。これにより、構築に副作用があると想定するようコンパイラーに指示し、最適化を防ぎます。あれは:

timer t; 
t.start(); 
for(int i=1;i<=1000;++i) 
  volatile object t; 
t.stop(); 
于 2012-01-24T14:56:06.637 に答える