考虑一个简单的阶乘函数:
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
编译会产生一个非常有趣的区别:
- g++ 7.3:我使用 10 条指令将几乎相同的循环结构转换为汇编。
- clang++ 5.0.0:我收到了 220 多条指令的一大堆乱七八糟的东西,我不知道发生了什么。
See the comparison here (Compiler explorer)
在本地构建并比较运行时,简单的 g++ 二进制文件在 Ubuntu 17.10 上的所有合理值(即不会导致溢出)的运行速度肯定更快。
谁能告诉我为什么 clang 会带来所有这些麻烦,它试图做什么(并且在大小和速度上都失败了)?强>
最佳答案
Can anyone tell me why clang is going to all this trouble, and what it's trying to do (and failing in both size and speed)?
它试图通过向量化代码来尽量减少测试和分支操作的数量。
它肯定在尺寸上失败了。至于速度有没有问题,你对标了吗?
如果您添加命令行选项 -ftree-vectorize
,gcc 将执行相同的操作。
关于c++ - 为什么 clang 会使我的简单阶乘函数过于复杂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49195429/