En primer lugar, la especificación inline
de una función es solo una pista. El compilador puede (y a menudo lo hace) ignorar por completo la presencia o ausencia de un calificador inline
. Dicho esto, un compilador puede alinear una función recursiva, del mismo modo que puede desenrollar un bucle infinito. Simplemente tiene que establecer un límite en el nivel al que "desenrollará" la función.
Un compilador de optimización podría convertir este código:
inline int factorial(int n)
{
if (n <= 1)
{
return 1;
}
else
{
return n * factorial(n - 1);
}
}
int f(int x)
{
return factorial(x);
}
en este código:
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);
}
}
}
}
En este caso, hemos básicamente la función inline 3 veces. Algunos compiladores hacen realizar esta optimización. Recuerdo que MSVC++ tenía una configuración para ajustar el nivel de alineación que se realizaría en las funciones recursivas (hasta 20, creo).
es #pragma inline_recursion (activado). La documentación sobre la profundidad máxima no es consistente ni concluyente. Los valores 8, 16 o el valor de #pragma inline_depth son posibles. – peterchen
@peterchen Si la función inlined está cambiando el valor de uno de sus argumentos, suceda, creo que es mejor alinear la función dentro de hecho en lugar de main. Perdón por mi inglés – obo
@obounaim: Podrías pensar eso. MSVC no. – SecurityMatt