質問:
コンパイラは次のような再帰関数をインライン化できますか?
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); }
最適化コンパイラは階乗関数を 3 回インライン化する場合があり、その結果、次のコードが生成されます。
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); } } } }
この最適化により、再帰が最大 3 レベルまで展開されます。コンパイラは、特定の再帰の深さと最適化設定に対してこの最適化を実行する場合があります。
以上がコンパイラは再帰関数をインライン化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。