c++ - 递归函数可以内联吗?

标签 c++ c compiler-construction

inline int factorial(int n)
{
    if(!n) return 1;
    else return n*factorial(n-1);
}

我正在阅读 this ,发现上面的代码如果没有被编译器正确处理会导致“无限编译”。

编译器如何决定是否内联函数?

最佳答案

首先,函数的 inline 规范只是一个提示。编译器可以(并且经常这样做)完全忽略 inline 限定符的存在或不存在。话虽如此,编译器可以内联递归函数,就像它可以展开无限循环一样。它只需对“展开”函数的级别设置一个限制。

优化编译器可能会转换此代码:

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

int f(int x)
{
    return factorial(x);
}

进入这段代码:

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

int f(int x)
{
    if (x <= 1)
    {
        return 1;
    }
    else
    {
        int x2 = x - 1;
        if (x2 <= 1)
        {
            return x * 1;
        }
        else
        {
            int x3 = x2 - 1;
            if (x3 <= 1)
            {
                return x * x2 * 1;
            }
            else
            {
                return x * x2 * x3 * factorial(x3 - 1);
            }
        }
    }
}

在这种情况下,我们基本上已经将函数内联了 3 次。一些编译器执行此优化。我记得 MSVC++ 有一个设置来调整将在递归函数上执行的内联级别(我相信最多 20 个)。

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

相关文章:

c++ - 如何在不输入 n 的情况下输入数组中的元素? (c++)

c++ - std::out_of_range at memory location error at getline

c - VIsual Studio 2013 中 C 语言的 GUI

iphone - 有没有办法在 Xcode 4.1 中使用 LLVM 3?

c++ - 如何比较两个 union 的排序

c++ - 如何在 C++ 中生成没有重复的正态分布?

c - 如何连接字符串但保留每个单独的空终止符?

c - 输入二维数组

string - 为什么不使用字符串缓冲区而不是不可变字符串?

c++ - Visual Studio 中的 _ITERATOR_DEBUG_LEVEL 错误