当前位置: 首页 > 知识库问答 >
问题:

为什么编译器优化在生成的程序集中不显示循环?

胡墨竹
2023-03-14

为了更好地理解编译器,特别是汇编语言,我一直在实验一段简单的代码,其中计算第一个N数字的总和,这应该导致N(N1)/2N(N-1)/2.

如代码所示,有两个功能:

#include <cstdint>


// Once compiled with optimization, the generated assembly has a loop

uint64_t sum1( uint64_t n ) {  
    uint64_t sum = 0;
    for ( uint64_t j=0; j<=n; ++j ) {
        sum += j;
    }
    return sum;
}

// Once compiled with optimization, the generated assembly of the following has no loop

uint64_t sum2( uint64_t n ) {  
    uint64_t sum = 0;
    for ( uint64_t j=0; j<n; ++j ) {
        sum += j;
    }
    return sum;
}

在第一个函数中,I从O循环到N,即j

我的理解/观察:

>

  • 对于第一个函数sum1,生成的程序集有一个循环,而对于第二个函数sum2,程序集没有显示循环。然而,一旦我删除了编译器优化,即-O3,那么您最终可以在程序集中看到第二个函数的循环。

    要查看通过编译器优化生成的程序集,请查看此优化。

    若要查看生成的程序集而不进行编译器优化,请查看此非优化。

    编译器是x86-64 clang

    问题:为什么编译器优化没有显示程序集中的另一个循环?


  • 共有1个答案

    邹锦
    2023-03-14

    这是因为你的编译器非常非常聪明,它知道从0到n的所有值的总和可以用一个微不足道的数学公式来计算,而不是循环。

    但是,您的C编译器也发现这个数学公式不能在中使用。

     类似资料: