如果将递归函数定义为内联,会发生什么?

时间:2011-03-01 04:30:29

标签: c++ function inline

  

可能重复:
  Can a recursive function be inline?

我认为定义为内联的递归函数不会产生任何影响,也不会内联。因为,编译器不知道有多少级别来复制内联函数的代码。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我尝试浏览相关的SO问题,为您找到明确的现有答案,但唉......

因此,keywoard inline(或类定义中定义的隐式内联的成员函数)有两个效果:

  • 保证可以在多个翻译单元中定义该函数而不违反一个定义规则,即在实践中,没有链接器抗议多个定义。对于此用途,函数的所有定义必须为inline,并且它们必须相同。

  • 它作为一个模糊的提示给编译器内联机器代码以调用该函数。有些电话可能是内联的,有些则不是。内联程度可能会有所不同,编译器甚至可能完全忽略这一提示(在实践中,g ++倾向于遵循暗示荒谬和可能不合理的程度,而Visual C ++更像是忽略它)。

对于递归函数,如果编译器遵循函数的任何特定调用的提示,则调用可以扩展为一个或两个或三个或任何递归级别。这是一件很难的事,所以不要指望它。此外,编译器自己的内联启发式可能比你的直觉更好,因为编译器具有更全局的事物视图(它知道更多),所以,总结:

不要将inline用于提示效果,请将其用于ODR保证。

如果你完全确定你比编译器更了解,并且你已经遵守“先测量”和“不做过早优化”等原则,那么你可以获得更可靠的控制通过编译器特定的语言扩展或编译指示进行内联。

干杯&第h。,

答案 1 :(得分:2)

显然,它无法无限重复代码。可能有一种方法以有限的方式进行,ala循环展开,但编译器确定的可能比简单的for(int i=0; i < 5; ++i)循环更难。

如果函数以特殊方式编码,编译器也可以使用tail call。虽然它不会在调用点逐个字节地重复汇编,但它可以避免设置堆栈帧并call使用该函数并将其替换为jmp指令,函数调用不需要比if语句更少的开销。

答案 2 :(得分:0)