问题:
编译器可以内联如下递归函数吗?
inline int factorial(int n) { if(!n) return 1; else return n*factorial(n-1); }
答案:
是的,编译器可以内联递归函数,但并不总是能保证。 inline 关键字只是向编译器提示,内联函数可能会有好处。编译器对于是否真正执行内联拥有最终决定权。
编译器的决策过程:
编译器在决定是否执行内联时会考虑多种因素是否内联函数:
编译器优化示例:
考虑以下代码:
inline int factorial(int n) { if (n <= 1) { return 1; } else { return n * factorial(n - 1); } } int f(int x) { return factorial(x); }
优化编译器可能会内联阶乘函数三次,从而生成以下代码:
int factorial(int n) { if (n <= 1) { return 1; } else { return n * factorial(n - 1); } } int f(int x) { if (x <= 1) { return 1; } else { int x2 = x - 1; if (x2 <= 1) { return x * 1; } else { int x3 = x2 - 1; if (x3 <= 1) { return x * x2 * 1; } else { return x * x2 * x3 * factorial(x3 - 1); } } } }
此优化将递归展开到三个级别。编译器可能会针对某些递归深度和优化设置执行此优化。
以上是编译器可以内联递归函数吗?的详细内容。更多信息请关注PHP中文网其他相关文章!