3 回答

TA貢獻1963條經(jīng)驗 獲得超6個贊
幀指針是一個引用指針,允許調(diào)試器通過單個常量偏移量知道局部變量或參數(shù)的位置。雖然ESP的值在執(zhí)行過程中會發(fā)生變化,但EBP保持不變,因此可以在相同的偏移量下達到相同的變量(例如,第一個參數(shù)將始終位于EBP + 8,而ESP偏移量可能會發(fā)生顯著變化,因為您將推動/彈出的東西)
為什么編譯器不丟棄幀指針?因為使用幀指針,調(diào)試器可以確定局部變量和參數(shù)在哪里使用符號表,因為它們保證與EBP保持一個恒定的偏移量。否則,沒有一種簡單的方法可以確定局部變量在代碼中的任何位置。
正如Greg所提到的,它還有助于堆棧展開調(diào)試器,因為EBP提供了堆棧幀的反向鏈接列表,因此讓調(diào)試器能夠計算出函數(shù)的堆棧幀(局部變量+參數(shù))的大小。
大多數(shù)編譯器提供了省略幀指針的選項,盡管它使調(diào)試變得非常困難。永遠不要在全局使用該選項,即使在發(fā)布代碼中也是如此。您不知道何時需要調(diào)試用戶的崩潰。

TA貢獻1815條經(jīng)驗 獲得超10個贊
把我的兩分錢加到已經(jīng)很好的答案上。
它是具有一系列堆棧幀的良好語言架構(gòu)的一部分。BP指向當前幀,其中存儲子例程局部變量。(當?shù)厝颂幱谪撈?,參?shù)處于正偏移量。)
它阻止了一個非常好的寄存器被用于優(yōu)化的想法提出了一個問題:優(yōu)化的時間和地點實際上值得嗎?
優(yōu)化僅在緊密循環(huán)中是值得的,1)不調(diào)用函數(shù),2)程序計數(shù)器花費大部分時間,3)編譯器實際將看到的代碼(即非庫函數(shù))。這通常只是整個代碼的一小部分,特別是在大型系統(tǒng)中。
其他代碼可以被扭曲和擠壓以擺脫循環(huán),并且它無關(guān)緊要,因為程序計數(shù)器幾乎從不存在。
我知道你沒有問過這個問題,但根據(jù)我的經(jīng)驗,99%的性能問題與編譯器優(yōu)化沒什么關(guān)系。它們與過度設(shè)計有關(guān)。

TA貢獻1712條經(jīng)驗 獲得超3個贊
當然,這取決于編譯器。我見過x86編譯器發(fā)出的優(yōu)化代碼,它們可以自由地使用EBP寄存器作為通用寄存器。(我不記得我注意到哪個編譯器。)
編譯器也可以選擇維護EBP寄存器以協(xié)助異常處理期間的堆棧展開,但這又取決于精確的編譯器實現(xiàn)。
添加回答
舉報