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

As I was reading this, found that the above code would lead to "infinite compilation" if not handled by compiler correctly.

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

推荐答案

首先,函数的inline规范只是一个提示.编译器可以(并且经常这样做)完全忽略inline限定符的存在或不存在.如上所述,编译器can内联递归函数,就像它可以展开无限循环一样.它只需对其"展开"函数的级别进行限制即可.

优化编译器可能会将以下代码:

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次.一些编译器do执行这种优化.我记得MSVC++有一个设置,可以调整递归函数的内联级别(我相信最多20个).

C++相关问答推荐

在严格的C89模式下,收件箱不会在' uint64_t '上发出警告

使用sd-设备列举设备导致seg错误

C指针地址和转换

ATmega328P USART发送字符重复打印

va_copy的使用是未定义的行为吗?

手动矢量化性能差异较大

如何在C中从函数返回指向数组的指针?

为什么cudaFree不需要数据 struct 的地址?

将数据移动到寄存器时出现分段故障

获取每个循环迭代结束时的当前时间

获取前2个连续1比特的索引的有效方法

C将数组传递给函数以修改数组

循环中的静态变量与块中的变量和循环

从另一个宏函数调用C宏

try 查找带有指针的数组的最小值和最大值

即使我在C++中空闲,也肯定会丢失内存

&stdbool.h&q;在嵌入式系统中的使用

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?

如何在C中计算包含递增和递减运算符的逻辑表达式?

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?