3

次のようなC++ IFステートメントがあります(疑似コード-すべての変数はintです):

if(x < y){
    c += d;
}
else{
    c += f;
}

IF ステートメントを削除して、代わりに値 d と f を 2 要素配列にロードしようと考えています。

array[0] = d
array[1] = f

そして、基になるブール型に基づいて配列要素 '0' または '1' を参照できるようにしたいと思います (少なくとも C-0 または 1)。これを行う方法はありますか?したがって、私のコードは次のように変更されます。

c += array[(x<y)] これが true の場合、c は f だけインクリメントされます。それ以外の場合、false の場合、c は d だけインクリメントされます。

ブール値の結果を使用して配列インデックスを検索することはできますか?

4

3 に答える 3

11

もちろんできます。しかし、あなたはそれを悪化させるだけである可能性があります. この場合、ブランチを削除していると思うなら、それは間違いです。製品品質のコンパイラと x86_64 アーキテクチャを想定すると、最初のバージョンは適切な条件付き移動 (つまりcmovge) になります。ただし、2 番目のバージョンでは、余分なレベルの間接参照と読み取りメモリが必要になります (つまり、mov eax,DWORD PTR [rax*4+0x4005d0].

もしあなたが提案を受け入れるなら、私はあなたが今非常に間違った道を進んでいると感じています. プログラムを最適化するときは、最初にボトルネックを特定するために測定/プロファイルを作成する必要があります。何がボトルネックかがわかって初めて、最適化を開始できます。最適化するときは、改善があるかどうかを確認するために、再度測定/プロファイリングする必要があります。あなたがしているように見えるのは、コンパイラを信頼せず、推測し、誤った最適化を行っていることです。すぐそこで止まることをお勧めします。そうしないと、そこから丘を下っていきます。私を信じてください。

于 2013-02-20T21:39:03.083 に答える
4

よりコンパクトなコードが必要な場合は、if ステートメントを次のように置き換えることができます。

c += (x < y) ? d : f;
于 2013-02-20T21:32:02.197 に答える
3

はい、うまくいきます。ただし、コードが理解しにくくなり、最新のコンパイラは if ステートメントを削除します (アセンブラーに変換する場合)。

于 2013-02-20T21:30:31.797 に答える