メモリトレースを作成する前にgccと-O3を使ってコードをコンパイルするキャッシュシミュレータで遊んでいる間に面白いことが起こりました。 min(x, y) (((x) < (y)) ? (x) : (y))
とmin
がif (a < b) then a else b
として定義されている場合3メモリにアクセスします。次のコード3次演算子キャッシュは不公平ですか?
:min
は三オペレータマクロとして定義されている場合、4つのメモリ内a[i] = min(a[i], b[j])
結果をアクセスします。
明らかに、シミュレータはマクロ内のすべての変数(ブランチ内の変数も含めて)をフェッチしますが、if-else
はこれを行いません。これは単なるシミュレータの本質的なものかバグですか、三項演算子の本当の問題ですか?
私は、その答えは、どのコンパイラを使用するか、おそらくそれを使っている最適化レベルに依存すると思います。 – Logicrat
「then」とは何ですか?いつ 'if'ステートメントはそれが式であるかのように値を生成しますか? –
gccの(期待どおりの)バージョンは、両方のバージョンで全く同じコードを生成します。正しい 'if'バージョンを直感的に読んでいると仮定します。 – SergeyA