2016-04-19 12 views
0

私は私がこのようなコードでループ離れて最適化コンパイラを防ぐことを可能にするコンパイラフラグを探しています:C++や錆コードの両方でC++コンパイルとRustコンパイルの両方でループ最適化をオフにする方法はありますか?

void func() { 
    std::unique_ptr<int> up1(new int(0)), up2; 
    up2 = move(up1); 
    for(int i = 0; i < 1000000000; i++) { 
     if(up2) { 
      *up2 += 1; 
     } 
    } 
    if(up2) 
     printf("%d", *up2); 
} 

を。私はスピードの点で同様のコードセクションを比較しようとしています。全体的な結果を評価するのではなく、このループを実行することが重要です。 Rustは静的にポインタの所有権が移動されていないことを保証しているので、ループの各反復でヌルポインタチェックを行う必要はなく、ループを最適化できない場合理由。

錆は、LLVMバックエンドを使用してコンパイルするので、私はC++でも同様に使用することをお勧めします。

+1

「volatile int i」を試してください。 – Unimportant

+0

別のオプションを別のモジュールに置き、 '-O0'でコンパイルすることです – Devolus

+2

そして、意図は何ですか?コンパイラがそのようなテストの理論上の結果を最適化できる場合、絶対に無駄です。だから、なぜこの仮説的な問題に時間を費やすのだろうか? – Klaus

答えて

1

コンパイラがアウェイループを最適化するのを避ける典型的な方法の1つは、コンパイル時にその境界を不定にすることです。この例では、10000000にループするのではなく、stdinまたはargvから読み取られるカウントまでループします。

+1

ループはまだ部分的に展開されており、ベクトル化されている可能性があります。 –

+1

@MatthieuM:右ですが、OPはアンローリングが害を及ぼさない「全体的な結果を評価するのではなく、このループを実行する」ことに興味があるようです。 –

+1

私が解明しようとしているのは「思われる」です。ここで何を測定しようとしているのかはわかりません... –

2

錆ではtest::black_boxを使用できます。

C++(gccを使用)asm volatile("" : "+r" (datum));thisを参照してください。

関連する問題