强制内联递归函数

Force inlining a recursive function

本文关键字:递归函数      更新时间:2023-10-16

考虑定义阶乘函数的经典方法:

#include <stdio.h>
__attribute__((always_inline)) inline int factorial(int n)
{
    if (n == 1){
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}
int main()
{
    printf("value %d", factorial(7/*guaranteed to not overflow int*/));
}

我强制我的编译器(gcc)内联阶乘函数。那个应该会引起问题。GCC没有错误地忽略了我的内联力。这是意料之中的吗?

来自GCC的文档:

GCC在非优化时不会内联任何函数,除非你为函数指定了always_inline属性。

所以always_inline并不意味着"内联这个或诊断",它意味着"内联即使优化关闭"。如果不可能或不合理,它仍然会拒绝内联。

正如您在这里看到的,对于像您这样简单的示例,整个函数可以被优化出来,结果可以在编译时计算出来。即使参数不是编译时常数,函数仍然可以内联。递归不总是使内联不可能。

然而,正如Floris Velleman所指出的,如果关闭优化,它将无法编译,说明该函数不考虑内联,即使在打开优化时它将内联它。似乎属性的实际处理与文档不完全一致。