c - 递归函数的内联

标签 c recursion inline

在 gcc 生成 asm 代码的阶段,内联函数被其代码替换。

对递归函数使用内联时会有什么行为

inline int fact (int n)
{
    if (n<=1)
        return 1;
    else
        return (n * fact(n-1));
}

当递归函数带有 inline 前缀并且递归函数没有 inline 时,我使用 gcc -S 生成 asm 代码前缀,我发现这两种情况的 asm 代码是相同的。

你对此有什么解释吗?

最佳答案

请注意,inline 只是对编译器的建议,编译器可能接受也可能不接受。遵守您的建议对编译器没有约束力。即使没有建议,智能编译器也会内联一个函数。通常,对于递归函数,编译器会执行到一定深度。

Why the compiler does not inline your function?

对于递归函数,编译器通常会寻找机会执行 tail call optimization 。您的函数不是尾调用递归的

关于c - 递归函数的内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14441718/

相关文章:

c - 使用 calloc 设置双指针

JavaScript 递归和函数

c - C 中的内联 Setter 和 Getter 函数

c - 在 C 中按值传递参数 : how big is too big?

c - make 编译失败,未定义对 `EVP_DigestUpdate 的引用

javascript - 在 Javascript 中执行尾端递归时是否必须手动释放内存

perl - 如何内联 Perl 子例程?

javascript - 如果 html 内联元素内部有 block 元素,如何使用 javascript 拆分它

Android alsa snd_pcm_open default no such file o 目录

c++ - 通过递归向前和向后设置数组最小值