上一期,我們討論了普通函式的呼叫過程,如果沒弄明白,看這裡
今天所要講的將是物件呼叫函式。
class c};
int _tmain(int argc, _tchar* ar**)
由於之前的普通函式的呼叫的基礎,所以,接下來主要分析下面幾個問題
物件呼叫如何傳遞物件到函式內靜態物件函式呼叫和普通物件函式呼叫有什麼不同
通過上圖可以看到,物件函式的傳參和普通函式相同,使用,壓棧式,不知道大家有沒有注意到,這裡存在兩個疑點,(1)明明我是物件呼叫函式,編譯器卻作為靜態函式呼叫模式呼叫。(2)編譯器將c的位址傳遞給了exc暫存器。我們就帶著這倆個疑點繼續向下看吧。
下面是c類的彙編
通過上圖可以看到,首先,函式內部將ecx暫存器內容壓棧,然後初始化函式棧內容,void f(int t)
然後將ecx的值傳入到dword ptr [this],最後完成賦值,實際在這裡有個疑問,之前人們都說物件函式在編譯期間將this指標作為第乙個引數進行傳遞,如果是按照第乙個引數傳遞,應該壓棧才對,為啥這裡沒有壓棧而實用暫存器進行傳遞。等下看看用靜態函式看看如何吧。
static類函式
在上面的代買基礎上新增了乙個靜態類函式,同時在呼叫兩個函式之間通過彙編**修改了ecx值,這個防止上乙個函式呼叫對這部分有影響
目前通過上圖可以看到,靜態函式的呼叫,連物件位址都沒有傳入。
通過上面的return的彙編**可以看到,它是直接返回的ds:[00a5f024h]的資料,static int t(
)
我們重新編譯可以發現&c= 0x0053fbd8
而上面ds:[00a5f024h]這個屬於棧中的資料,
小結1)學到這裡,我們應該明白了成員方法呼叫時,在編譯過程中,編譯器會將物件的位址通過ecx暫存器傳入到函式中,並通過位址訪問物件的成員變數。
2)成員方法的呼叫最終都是轉換為了靜態函式呼叫,通過傳遞物件的位址來辨別不同型別的方法
3)實際靜態成員函式也好,普通成員函式也好,呼叫都是通過我們上節函式呼叫類似,換湯不換藥
4)靜態成員函式呼叫過程中,編譯器並沒有傳遞物件的位址到函式中,這也是為什麼靜態成員函式無法呼叫普通成員變數的原因
老碼識途讀書筆記 1
知識點記錄 1.int 或指標型別的全域性變數預設初始化為0,區域性變數則為0xcccccccc。win7 vs2008 2.記憶體溢位攻擊即使用6個位元組空間改變程式執行流程達到某種目的。話說當時在課本中看到這個概念卻一直不懂是怎麼回事。原因是win7支援一種防止溢位攻擊的保護機制,阻止 放在在堆...
雷柏眾聯綠標與最老款產品對碼教程
雷柏眾聯綠標與最老款產品對碼教程 對碼前準備工作.安裝程式 重啟電腦 必須 開啟對碼工具 方法 桌面左下角 開始 程式 rapoo 開啟對碼工具 雷柏對碼步驟過程 先將接收器插入usb口,再開啟對碼軟體,順序弄反會出現提示未找到接收器.正常需要寫碼的過程,故此步驟省略,自己亂寫碼以至於接收器損壞的 ...
小碼農聽邏輯思維老羅之融入大城市有感
以前沒聽過邏輯思維,以為是一家公司名字而已,昨天在一前外包同事qq空間裡看到說聽了好幾遍 張泉靈演講的那一期邏輯思維 實話說來對我這樣的小碼農還是有很大的開啟,聽後大致知道是乙個脫口秀。老羅最後出來總結本期的主題其中說到選擇大學 不是大學怎麼樣,專業怎麼樣 首先要在大都市,並且學校不能在 偏遠郊區的...