除錯查看匯編是通過暫存器傳的
但《程式員的自我修養》的“呼叫慣例”卻只說了用堆疊,沒有提用暫存器
連標了__cdecl的庫函式,呼叫時都是通過暫存器的,為什么?不應該是通過堆疊嗎?
uj5u.com熱心網友回復:
大部分的呼叫約定都是用堆疊的,fastcall 會用暫存器不過引數多的話,也會用堆疊。雖然暫存器運算快,但暫存器的數量是有限的,且大部分暫存器都有其特定的用途,當引數占用了暫存器,如果不通過記憶體空間存盤的話,就沒辦法進行復雜的運算了。。。。。
uj5u.com熱心網友回復:
呼叫約定有好多種,如有必要你可以自己制造一個新規定。這說明啥?說明語言標準沒有規定呼叫約定。
為什么不規定?
因為一是各種體系結構差異過大,二是硬體在快速發展進化。
歷史唯物主義告訴我們,一份資料/文獻是受到時代制約和局限的,它沒法用確定的語氣展望它的未來我們的現在。
uj5u.com熱心網友回復:
x64里面通用暫存器比原來多了,夠用了,不用白不用啊。蘋果M1又掀開了新的歷史,以后的硬體會越來越個性,我們會越來越理解語言規范里留白的魅力。
uj5u.com熱心網友回復:
看匯編,實際還是用的暫存器,沒按呼叫約定來
uj5u.com熱心網友回復:
用暫存器遇上中斷咋辦?用堆疊的話好歹是保存到記憶體的
主要是,它是標了__cdecl這類使用堆疊的呼叫約定的呀,如果不用的話,就不應該標呀,不至于編譯器都改了,庫的呼叫約定的實作也該了,但標稱的__cdecl卻不去掉或者更換?這不合理啊
32位和64位版都用的暫存器,不知道是不是檢測了CPU型號才這樣做的
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/272069.html
標籤:C語言
