考虑一个简单的因子函数:
static int factorial(int n) {
if (n <= 0) return 1;
return n * factorial(n - 1);
}
int main(int argc, char** argv) {
return factorial(argc);
}
使用-O2
进行编译会产生一个非常有趣的区别:
See the comparison here (Compiler explorer)
在本地构建并比较运行时,简单的g ++二进制文件肯定会在Ubuntu 17.10上为所有值(即不会导致溢出)运行得更快。
任何人都可以告诉我为什么 clang会遇到所有这些麻烦, 它想要做什么(并且无论是大小还是速度)吗
答案 0 :(得分:4)
任何人都可以告诉我为什么clang会遇到所有这些麻烦,以及它尝试做什么(并且在尺寸和速度上都失败了)?
它试图通过矢量化代码来最小化测试和分支操作的数量。
它的规模肯定是失败的。至于它是否在速度上失败,你有没有标记呢?
如果添加命令行选项-ftree-vectorize
,gcc也会这样做。