2

-fomit-frame-pointerは常にフレームポインタを省略しますか?PCとFPの両方をセットアップする必要がある状況はありますか?動的なスタックの増加により、fpがセットアップされますか?特にMIPS32を求めています。ありがとう!

4

3 に答える 3

4

フレーム ポインターは、例外のアンワインドの場合を除いて、正しい実行に実際には必要ありません。通常、動的なスタックの増加には何らかのフレーム ポインターが必要ですが、特定のレジスターに関連付けられているのではなく、通常のデータ フロー分析によって割り当てられます。

基本的に-fomit-frame-pointer、FP を固定レジスタ割り当てから疑似レジスタに降格し、初期化をデッド ストアの削除対象にします。したがって、最初の質問に対する答えはノーです。常に省略されているわけではありません。

于 2011-02-16T13:46:43.600 に答える
2

いいえ、通常、フレーム ポインタは必要ありません。コンパイラは、スタック ポインターに関連するローカル変数にアクセスでき、特別なフレーム ポインターは必要ありません。

-gそれにもかかわらず、標準のフレーム ポインター セットアップ シーケンスは、デバッガーがフレーム ポインター情報を使用して呼び出しスタックを再構築できるため、クラッシュしたプログラムをデバッグするときに ( でコンパイルされていない場合でも) 役立ちます。フレーム ポインタがない場合、1 つのスタック フレームの開始位置と次の終了位置を把握するための情報がありません。

そのため、使用-fomit-frame-pointerすると、パフォーマンスと引き換えに、クラッシュした場合のデバッグがはるかに困難になります。コードのパフォーマンスに重要な部分が小規模なループであり、関数をまったく呼び出さない場合、フレーム ポインターを省略してもメリットはほとんどありません。

于 2011-02-16T17:06:11.840 に答える
0

mips の人ではありませんが、どのシステムにも当てはまります。スタックを任意の時点で整列する必要がある場合は、元のポインタを格納するためにフレームを使用する必要があります (スタック アドレスと整列が不明な場合があるため)。

于 2011-02-16T16:30:50.043 に答える