[解決済み] なぜコードは積極的にテールコールの最適化を防ごうとするのだろうか?
疑問点
質問のタイトルは少し奇妙かもしれませんが、私の知る限りでは、テールコールの最適化に対して話すことは全くありません。しかし、オープンソースプロジェクトを閲覧しているとき、私はすでに積極的にテールコールの最適化を行うからコンパイラを停止しようとするいくつかの関数、例えば、実装の CFRunLoopRef の実装のように、このような ハック . 例えば
static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__() __attribute__((noinline));
static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__(CFRunLoopObserverCallBack func, CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info) {
if (func) {
func(observer, activity, info);
}
getpid(); // thwart tail-call optimization
}
なぜこのようなことが重要だと思われるのか、また、私自身が 通常 の開発者がこのことを心に留めておく必要があるようなケースはありますか?例えば、テールコールの最適化で一般的な落とし穴があるのでしょうか?
どのように解決するには?
私が推測するところでは、以下のことを確実にするためです。
__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
がスタックトレースに含まれるようにするためだと思います。これには
__attribute__((no inline))
があり、この考えを裏付けています。
気づいたら、その関数はとにかく別の関数に移動して跳ねています。これはトランポリンの一種で、デバッグを助けるためにこのような冗長な名前がついているとしか思えません。これは、関数が他の場所から登録された関数ポインターを呼び出しているため、その関数がアクセス可能なデバッグ シンボルを持たない可能性があることを考えると、特に有用でしょう。
バックトレースから何が起こったかを見るのに役立つように、本当にそこにあるように見えます。 これは Mac OS X のコア コードであり、クラッシュ レポートおよびプロセス サンプル レポートにも表示されることを覚えておいてください。
関連
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み] テールコール最適化とは何ですか?
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] なぜGCCは、速度の代わりにサイズに最適化すると、15-20%速いコードを生成するのですか?
-
[解決済み] 末尾再帰最適化を行うC++コンパイラがあるとすれば、どのコンパイラですか?
-
[解決済み] なぜJVMはテールコールの最適化をまだサポートしていないのですか?
-
[解決済み] Haskellには末尾再帰的最適化があるか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む