gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:33:10 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com