我没有看到任何理由为什么函数static应该帮助编译器特别优化递归调用.
很快,您看到的递归函数更可能只是编译单元的内部函数.递归函数通常需要一个比想要暴露给程序其余部分更丰富的接口 - 例如,可能有额外的参数仅由递归调用使用,或者一般调用的返回值可能需要调整以适应想要呈现给代码的其余部分的抽象.因此,通常编写一个包装函数来设置额外参数的默认值,并且通常将递归函数的接口调整为外部有意义的好东西.
现在因为递归函数只能由它自己和包装器函数调用,所以很自然地声明它static- 不是因为递归本身,而是为了防止用它来污染全局命名空间.编译器也可以使用更有效的调用约定(适用于特定的函数体)用于静态函数,因为它知道所有调用站点,并且不必遵循ABI,它将让单独编译的代码调用它.