2

我最近阅读了几个声明的递归函数static

在函数声明前添加是否static有助于 GCC 优化尾递归函数?这是获得优化的必要条件吗?

4

3 回答 3

8

我看不出为什么一个函数static应该帮助编译器特别优化递归调用。

立即,听起来您所看到的递归函数更有可能只是编译单元的内部。递归函数通常需要比想要向程序的其余部分公开的更丰富的接口——例如,可能有仅由递归调用使用的额外参数,或者一般调用的返回值可能需要调整以适应想要呈现给其余代码的抽象。因此,通常编写一个包装函数来设置额外参数的默认值,并且通常将递归函数的接口调整为在外部有意义的好东西。

现在既然递归函数只被它自己和包装函数调用,那么声明它是很自然的static——不是因为递归本身,而是为了防止它污染全局命名空间。编译器也有可能对静态函数使用更有效的调用约定(适用于该特定函数体),因为它知道所有调用位置,并且不必遵循允许单独编译的代码调用它的 ABI。

于 2012-10-28T17:25:24.190 回答
3

不,static与任何递归优化无关。当一个函数被声明static时,它会获得内部链接,因此除了同一个翻译单元中的其他函数之外,它不能被调用/使用。

于 2012-10-28T17:24:50.597 回答
1

静态(即内部链接)对函数的一种影响是它告诉编译器直接调用给定函数的所有可能用例都本地化在当前翻译单元中。这可能确实对某些优化有影响。例如,如果编译器决定在翻译单元中内联对给定函数的所有调用(并且从未获取过该函数的地址),它会立即知道该函数不需要独立的主体。或者,再举一个例子,如果函数总是1作为参数调用,那么从技术上讲,这个参数可以完全消除。等等。

使用外部链接函数也可以进行此类优化,但需要有关整个程序的全局知识(这就是它们通常被称为全局优化的原因)。借助内部链接功能,所有这些可能性都在一个翻译单元内开放。

但是,对于尾递归消除等优化,这无关紧要。

于 2012-10-28T17:33:12.697 回答