2016-04-06 7 views
2

メモリトレースを作成する前にgccと-O3を使ってコードをコンパイルするキャッシュシミュレータで遊んでいる間に面白いことが起こりました。 min(x, y) (((x) < (y)) ? (x) : (y))minif (a < b) then a else bとして定義されている場合3メモリにアクセスします。次のコード3次演算子キャッシュは不公平ですか?

minは三オペレータマクロとして定義されている場合、4つのメモリ内a[i] = min(a[i], b[j])結果をアクセスします。

明らかに、シミュレータはマクロ内のすべての変数(ブランチ内の変数も含めて)をフェッチしますが、if-elseはこれを行いません。これは単なるシミュレータの本質的なものかバグですか、三項演算子の本当の問題ですか?

+2

私は、その答えは、どのコンパイラを使用するか、おそらくそれを使っている最適化レベルに依存すると思います。 – Logicrat

+3

「then」とは何ですか?いつ 'if'ステートメントはそれが式であるかのように値を生成しますか? –

+0

gccの(期待どおりの)バージョンは、両方のバージョンで全く同じコードを生成します。正しい 'if'バージョンを直感的に読んでいると仮定します。 – SergeyA

答えて

4

実際はコンパイラベンダーによって異なります。

int min(int a, int b) { 
    return (a < b)? a : b; 
} 

int min(int a, int b) { 
    if(a < b) 
    return a; 
    else 
    return b; 
} 

GCCバージョン5.3および-O3とクランバージョン3.8によってそれらのために生成されたアセンブリコードが同じである:

min(int, int): 
     cmpl %esi, %edi 
     movl %esi, %eax 
     cmovle %edi, %eax 
     ret 

GCC Live Demo

しかし、min(int, int)次の2つのバージョンを考慮CLANG Live Demo

したがって、少なくとも2つの主要ベンダーについて、2つのバージョン(すなわち、3つのオペラtorとif-else)は同等です。

+0

実際に生成されたコードを少数の主要なコンパイラでチェックするためにアップしました。 –

0

通常、3項演算子とif-then-else文を使用すると、コンパイラで同じ中間表現が使用されます。どちらも同じことをしますが、どちらも同じようにキャッシュに優しいです。

私は違いは、2つの実装の間で変化し、他のものから来ていると思われるが、それらを見ることなく、私は問題が何であるかを伝えることはできません。

関連する問題