【发布时间】: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 为你做......