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';
}

编译器会将上述优化为一个循环吗?还是在一个for循环中编写更好?

4

3 回答 3

3

这取决于编译器。例如,我的编译器(g++ 4.7.3on x86_64)没有,保留两个单独的循环(使用 编译时-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 个元素,循环融合没有任何意义。

另请注意,融合没有意义,因为该操作仅执行一次(在该示例中)。


要获得更详细的答案,请查看编译器的汇编输出并比较不同编译器的输出。


另一件事是,如果它不能提高性能,为什么还要关心这种微优化。

于 2013-04-07T11:59:00.010 回答