c++ - 为什么 clang 会使我的简单阶乘函数过于复杂?

标签 c++ assembly x86 compiler-optimization clang++

考虑一个简单的阶乘函数:

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/

相关文章:

c++ - 如何多线程队列处理

c - 如何将变量传递给使用 gcc 编译的 intel 格式内联 asm 代码

linux - 使用内存映射的IO时调用ioread函数有什么好处

assembly - 在 Commodore 64 上使用程序集写入磁盘文件

linux - bin执行错误

linux - 如何在AMD(EPYC)处理器上使用rdpmc指令?

gcc - 如何在 x64 计算机上使用 gcc 编译 x86 汇编代码

c++ - 是否可以在 C++ 中的 2 个或更多文件中定义一个类?

c++ - 为什么我不能从一对中返回一个 unique_ptr?

c++ - TCP 库正在捆绑消息?