Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 强制内联递归函数_C++_Gcc_Inline - Fatal编程技术网

C++ 强制内联递归函数

C++ 强制内联递归函数,c++,gcc,inline,C++,Gcc,Inline,考虑定义阶乘函数的经典方法: #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/*guara

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

#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*/));
}
#包括
__属性(总是内联)内联整数阶乘(整数n)
{
如果(n==1){
返回1;
}否则{
返回n*阶乘(n-1);
}
}
int main()
{
printf(“值%d”,阶乘(7/*保证不会溢出int*/);
}

我强制我的编译器(gcc)内联阶乘函数。这应该会引起一个问题。gcc忽略了我的强制内联,没有错误。这是预期的吗?

来自GCC文件:

除非您为函数指定
always\u inline
属性,否则GCC在未优化时不会内联任何函数

所以
始终\u inline
不是指“inline this或diagnose”,而是指“inline即使优化关闭”。如果不可能或不合理,它仍将拒绝内联某些内容

如您所见,对于像您这样简单的示例,可以优化整个函数,并在编译时计算结果。即使参数不是编译时常量,函数也可以是。递归并不总是使内联变得不可能


然而,正如所指出的,如果您关闭优化,它将声明函数不考虑内联,即使如果打开优化,它将内联它。属性的实际处理似乎与文档不完全一致。

递归函数不能是内联函数。我认为编译器忽略了您的“属性”,因为this@Agostino:如果你读了这个问题,OP知道,这就是他问这个问题的原因…既然你用常数调用阶乘,你怎么知道它不是内联的?我不知道gcc是否那么聪明。当我多年前测试icc(以及之前的版本)时,它并没有那么聪明(常数的优化发生在之后,而不是与内联混合)。但也许gcc现在比icc更聪明。@Agostino有趣,但我认为内联递归函数可以变成循环,直到达到一定深度,有效地内联递归函数()。@Florisvellman哇,我不知道,谢谢你的回答,有趣的是,如果您碰巧在没有优化的情况下编译它,这会导致编译时错误,如果您碰巧使用编译时常量,那么
constexpr
似乎更适合。