0

次のコードがあるとします。

int main () {
 int myints[] = {3,7,2,5,6,4,9};

 // using default comparison:
 std::cout << "The smallest element is " << *std::min_element(myints,myints+7) << '\n';
 std::cout << "The largest element is "  << *std::max_element(myints,myints+7) << '\n';
}

コンパイラは上記を 1 つのループに最適化しますか? それとも1つのforループで書いたほうがいいのでしょうか?

4

3 に答える 3

3

コンパイラに依存します。たとえば、私のコンパイラ ( g++ 4.7.3on x86_64) はそうではなく、2 つの別々のループを保持します ( でコンパイルする場合-O3):

_main:
;=== initialization code omitted ===
        jmp     L2
L3:
        movl    (%rax), %edx
        cmpl    %edx, %ebx
        cmovg   %edx, %ebx
L2:
        addq    $4, %rax
        cmpq    %rbp, %rax
        jne     L3
;=== output code omitted ===
        jmp     L8
L6:
        movl    (%rax), %ecx
        cmpl    %ecx, (%rdx)
        cmovl   %rax, %rdx
L8:
        addq    $4, %rax
        cmpq    %rbp, %rax
        jne     L6
;=== output code omitted ===
于 2013-04-07T11:59:11.237 に答える
3

定義上、最適化は標準によって義務付けられていないため、実際にはコンパイラに依存します...そして他の条件の巻き上げに依存します。

ただし、特定のケースでは、合図したいと思いstd::minmax_elementます...便利になるかもしれません。

于 2013-04-07T13:34:37.563 に答える
1

答えは、多くの場合と同様で、場合によって異なります。

はい、ヒューリスティックに基づいて実行時のパフォーマンスを適切に改善するため、コンパイラがループを融合することを決定した場合。

要素が 7 つしかなく、ループ融合は意味をなさないため、いいえの可能性がはるかに高くなります。

また、操作は 1 回しか実行されないため (この例では)、フュージョンは意味をなさないことに注意してください。


より詳細な回答を得るには、コンパイラのアセンブリ出力を見て、さまざまなコンパイラの出力を比較してください。


もう1つのことは、パフォーマンスが向上しない場合、なぜそのようなマイクロ最適化を気にする必要があるかということです.

于 2013-04-07T11:59:00.010 に答える