强制内联递归函数
Force inlining a recursive function
本文关键字:递归函数 更新时间:2023-10-16
考虑定义阶乘函数的经典方法:
#include <stdio.h>
__attribute__((always_inline)) inline int factorial(int n)
{
if (n == 1){
return 1;
} else {
return n * factorial(n - 1);
}
}
int main()
{
printf("value %d", factorial(7/*guaranteed to not overflow int*/));
}
我强制我的编译器(gcc)内联阶乘函数。那个应该会引起问题。GCC没有错误地忽略了我的内联力。这是意料之中的吗?
来自GCC的文档:
GCC在非优化时不会内联任何函数,除非你为函数指定了
always_inline
属性。
所以always_inline
并不意味着"内联这个或诊断",它意味着"内联即使优化关闭"。如果不可能或不合理,它仍然会拒绝内联。
正如您在这里看到的,对于像您这样简单的示例,整个函数可以被优化出来,结果可以在编译时计算出来。即使参数不是编译时常数,函数仍然可以内联。递归不总是使内联不可能。
然而,正如Floris Velleman所指出的,如果关闭优化,它将无法编译,说明该函数不考虑内联,即使在打开优化时它将内联它。似乎属性的实际处理与文档不完全一致。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何在Elixir中调用递归函数并行
- 递归函数有效,但无法记忆
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么递归函数的最终输出是 5?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 如何将记忆应用于此递归函数?
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 无穷大而循环时具有递归函数
- 即使没有调用这个递归函数,它是如何工作的?
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 此递归函数的每次迭代的值存储在哪里?
- 可以清除递归函数中的变量吗?
- 如何在递归函数调用中返回当前函数值
- 递归函数 c++ 的复杂性
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 任何人都可以查明我的递归函数中的错误吗?
- 递归函数的返回类型推导
- 递归函数调用在后台工作
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数