[解決済み] 再帰的な関数はインライン化できますか?
2022-05-05 23:47:48
質問
inline int factorial(int n)
{
if(!n) return 1;
else return n*factorial(n-1);
}
を読んでいるうちに これ このコードは、コンパイラによって正しく処理されないと、無限コンパイルにつながることがわかりました。
コンパイラは関数をインライン化するかどうか、どのように判断しているのですか?
どのように解決するのですか?
まず
inline
の指定は単なるヒントに過ぎません。 コンパイラは、関数中の
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);
}
}
}
}
この場合、基本的に関数を3回インライン化したことになります。 一部のコンパイラは する はこの最適化を行います。 MSVC++には、再帰的な関数に対して実行されるインライン化のレベルを調整する設定があったのを覚えています(最大20まで、確か)。
関連
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] std::stringをintに変換するにはどうしたらいいですか?
-
[解決済み] 関数からunique_ptrを返す
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー