为什么叮当使我的简单阶乘函数过于复杂
Why is clang over-complicating my simple factorial function?
考虑一个简单的阶乘函数:
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+指令,我不知道发生了什么。
请参阅此处的比较(编译器资源管理器(
在本地构建并比较运行时,简单的 g++ 二进制文件对于 Ubuntu 17.10 上合理范围内的所有值(即不会导致溢出(肯定会运行得更快。
谁能告诉我为什么 clang 会遇到所有这些麻烦,以及它试图做什么(并且在大小和速度上都失败了(?
谁能告诉我为什么 clang 会遇到所有这些麻烦,以及它试图做什么(并且在大小和速度上都失败了(?
它试图通过矢量化代码来最大限度地减少测试和分支操作的数量。
它肯定在尺寸上失败了。至于它是否在速度上失败,你有没有基准测试过?
如果您将命令行选项添加到 -ftree-vectorize
,GCC 将执行相同的操作。
相关文章:
- 函数复杂度分析
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 函数的时间复杂度是多少?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 使用 Python Extension API 包装复杂C++类
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何计算此排序函数的时间复杂度?
- 计算两个代码块的时间复杂度
- 将平面阵列重塑为复杂的特征类型
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在复杂继承中访问静态成员变量
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- OpenCV 傅里叶变换复杂输出问题
- 具有嵌套 if-else 的循环的时间复杂度
- 在 for 循环中处理复杂的发送 recv 消息
- C++:如何用单个命令替换复杂的迭代?
- 我可以使用' == '来比较两个向量吗?我试过了,似乎工作正常。但我不知道它是否适用于更复杂的情况