いくつかの実験やおもちゃを通じて、ほとんどの投稿に同意するよ。must_tail属性が主要な3つのコンパイラで信頼できるものになればいいんだけど、今のところそれは期待できないね(幸いにも、最近のClangはWindowsでかなり信頼できるみたい)。追加で2つのポイントがあるんだけど、1つ目は、記事がDWARFについて触れているけど、これがなくても#lineディレクティブを使って生成されたコードに行番号を付けられるよ(デバッグの際にすごく役立つ)。もう1つは、ローカル変数とその内容について。変数については、C++のサブセットを使うことでかなりの距離を稼げるよ(コンパイル時間に影響しないサブセット、つまりstd::名前空間のインクルードは避ける)。例えば、"root/gc/smart"ポインタなど(言語のセマンティクスによるけど)、#lineディレクティブがあればデバッガーに変数が表示されるから、「まともな」名前のマングリングが必要だね。2つ目は、Cをバックエンドにしたときの本当の痛点はGCだよ。最良のGCは通常のスタックフレームと絡み合っているから、普通のスタックウォーキングルーチンも正確なGCに必要な情報を提供するんだ(移動GC設計には必須、もっと単純な世代コレクタはそれなしでも可能だけど)。もし正確でそこそこ速いポータブルなスタックスキャンが必要なら、現在の最も理にかなった方法はシャドウスタックを維持することだね。呼び出しの際に前のフレームポインタを渡して、前のフレームポインタはフラットな配列の末尾を指すポインタで、マジックポインタと前の前のフレームポインタを前に追加して(いくつかの書き込みコストと、クリーンアップコストなしの追加引数でリンクリストを形成する)。残念ながら、パフォーマンスの良いリンクドシャドウスタックはデバッグのためにすべてのポインタを隠してしまうから、複数の名前付き変数ではなく1つの配列にまとめる必要があるし、スタック上の複雑なオブジェクトを制限されるんだ。新しいC++のリフレクションサポートを使ってシャドウスタックを利用できればいいけど、コンパイル時間が壊れないことを願ってるよ。でも、それはまた別の話だね。