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/