我主要有兩個問題:
1. 關于變參函式,是不是不管宣告何種呼叫約定,其都會實作為__cdecl?下面是VC的匯編,實際指定的是__stdcall。

2. gcc的對堆疊清理的方式怎么和VC不一樣啊?或者說這算堆疊清理嗎?

觀察了它幾次呼叫,發現它每次傳參都是拿同一段空間反復使用,就是圖中入堆疊的那段,對不同函式的呼叫,傳參都是用的這同一段,作為呼叫方把控了傳參的堆疊空間,是不是也相當于做了堆疊清理?或者說這能算堆疊清理嗎?
(編譯用的32位,非x64約定)
uj5u.com熱心網友回復:
1. stdcall 等呼叫約定的規則就限制了他們進行變參函式的使用 。 當然也有些特殊情況。2.堆疊清理 是什么東西?? 引數傳遞的入堆疊和出堆疊嗎? gcc 和 vc 傳參時對堆疊的使用基本是相同的 ,只不過 gcc 提前分配了空間 而vc使用push ,但是每次使用完堆疊都是平衡的 。
uj5u.com熱心網友回復:
1、對于變參函式,其呼叫約定只能為__cdecl,因為只有呼叫者才知道傳了多少個引數,被呼叫者是無法知道的(有標志意義的引數除外),所以這時也只能由呼叫者來做堆疊清理,恢復到呼叫前的狀態
2、每次傳參都是拿同一段空間反復使用,這本身就是堆疊的處理方式,是優于堆的地方,每一次函式呼叫后,都會恢復到呼叫前的狀態,所以一般情況下堆疊不需要特別大的空間,函式式編程中的尾遞回就是堆疊的極致利用方式
3、不論是那種呼叫約定,只要每一次函式呼叫后將堆疊恢復到呼叫前的狀態,都可以認為是堆疊清理,也叫堆疊平衡
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/283962.html
標籤:C語言
上一篇:新人入職怎么看公司的專案代碼
下一篇:求大佬
