【问题标题】:How does a modern compiler go about optimizing this code [closed]现代编译器如何优化此代码[关闭]
【发布时间】:2020-07-24 07:30:15
【问题描述】:

现代编译器将如何优化此代码:

int fn (int a, int b)
{
    int sum = 0;
    for(int i=4*a; i>0; i--)
    {
        sum += b*i*i;
    }
    return sum;
}

【问题讨论】:

  • 编译看看!
  • @churill >> 的 html 清理替代品。所以他只是从 4 次 a 循环到 1 次。
  • 如果你想手动优化它,这是b *(n = 1..4a的n^2之和),并且有一个平方和的公式:(2n^3 + 3n^2 + n) / 6 对于 1..n。所以代入,结果是 4b(32a^3 + 16a^2 + a)/6 表示正 a。不知道编译器是否会为您生成。
  • godbolt.org中使用不同标志检查您的代码生成的汇编代码
  • 所有编译器都会为您提供选项,允许您将编译器生成的程序集转储到文件中。您可以简单地保存上面的代码,然后使用不同的优化级别进行编译,将程序集输出到不同的文件中进行比较。编译器如何优化将取决于编译器和硬件。 ARM 优化将不同于 x86 将不同于 x86_64,等等。@nayab 有正确的想法——你可以让 Godbolt 为你做......

标签: c++ compiler-optimization


【解决方案1】:

这个问题没有简单的答案,因为有很多编译器,有很多标志可以修改使用的编译和优化,根据目标架构可能会使用不同的优化。

您最好的尝试是转到compiler explorer 并检查由具有不同标志的不同编译器生成的程序集。如果要比较输出,则需要了解汇编。如您所见,最新版本的 gcc 和 clang 为相同的代码和相同的优化级别生成了非常不同的版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2014-01-10
    • 2011-11-24
    • 2015-09-15
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多