16

デフォルトで 64 ビット アーキテクチャでフレーム ポインタを削除する理由は何ですか? 有効にできることはよく知っていますが、32ビットで有効にしているのに、GCCが最初に無効にするのはなぜですか? 結局、64 ビットには 32 ビット CPU よりも多くのレジスタがあります。

編集:

最近の GCC バージョンを使用すると、x86 のフレーム ポインターも削除されるようです。マニュアルから:

GCC バージョン 4.6 以降、32 ビット Linux x86 および 32 ビット Darwin x86 ターゲットのデフォルト設定 (サイズを最適化しない場合) が -fomit-frame-pointer に変更されました。-fno-omit-frame-pointerconfigure オプションを使用して GCC を構成すると、デフォルトに戻すことが--enable-frame-pointerできます。

しかし、なぜ?

4

1 に答える 1

12

x86-64 の場合、ABI (PDF) はフレーム ポインターの非存在を推奨しています。その理由は多かれ少なかれ、「今は DWARF があるので、デバッグや例外の巻き戻しには必要ありません。最初からオプションにすれば、その存在に依存するソフトウェアはなくなるでしょう」というものです。

x86-64 には x86-32 よりも多くのレジスタがありますが、それでも十分ではありません。より多くの汎用レジスターを解放することは、コンパイラーの観点からは常に良いことです。確かに、スタック クロールを必要とする操作は遅くなりますが、まれなイベントであるため、すべてのサブルーチン呼び出しを数サイクル削減し、スタック スピルを少なくすることとの良いトレードオフです。

于 2011-05-23T16:29:49.560 に答える