欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
潘凱:C 對象布局及多態(tài)實(shí)現的探索(五)

  普通成員函數的調用

  從這部分開(kāi)始我們除了利用內存的信息打印來(lái)進(jìn)行探索外,更多的會(huì )通過(guò)跟蹤和觀(guān)察編譯器產(chǎn)生的匯編代碼來(lái)理解編譯器對這些語(yǔ)言特性的實(shí)現方式。匯編方面知識的討論超出了本文的范圍,我只對和我們討論相關(guān)的匯編代碼進(jìn)行解析。理解本文要討論的知識并不需要有很完整的匯編知識,但必須了解起碼的概念。
  下面我們看看引入虛繼承后的影響。為了有所對比我們首先看看普通成員函數的調用情況。
  執行如下代碼,它包括了對象的普通成員函數調用,類(lèi)的靜態(tài)成員函數調用、通過(guò)指針調用普通成員函數:
C010 obj;
PRINT_OBJ_ADR(obj)
obj.foo();
C012::sfoo();
C010 * pt = &obj;
pt->foo();
  結果如下:
obj's address is : 0012F843
  這是obj對象的內存地址。
  首先我們看看對象的普通成員函數調用,obj.foo();,對應的匯編代碼為:
00422E09 lea ecx,[ebp+FFFFF967h]
00422E0F call 0041E289
  第1行把對象的地址存入ecx寄存器,執行完這行指令后,我們要以看到ecx中的值為0x0012F843,就是前面打印出的值。如果函數需要傳遞參數,我們還會(huì )在前面看到一些push指令。在第2行我們可以看到call的是一個(gè)直接的地址,這也就是靜態(tài)綁定。即函數的調用地址在編譯時(shí)已經(jīng)被編譯器決議。
  跟蹤進(jìn)去我們要以看到是一條跳轉指令,繼續執行可以看到真正的函數代碼部分,如下(注:為了討論方便我在第行前面加了一個(gè)行號):
01 00425FE0 push ebp
02 00425FE1 mov ebp,esp
03 00425FE3 sub esp,0CCh
04 00425FE9 push ebx
05 00425FEA push esi
06 00425FEB push edi
07 00425FEC push ecx
08 00425FED lea edi,[ebp+FFFFFF34h]
09 00425FF3 mov ecx,33h
10 00425FF8 mov eax,0CCCCCCCCh
11 00425FFD rep stos dword ptr [edi]
12 00425FFF pop ecx
13 00426000 mov dword ptr [ebp-8],ecx
14 00426003 mov eax,dword ptr [ebp-8]
15 00426006 mov byte ptr [eax],2
16 00426009 pop edi
17 0042600A pop esi
18 0042600B pop ebx
19 0042600C mov esp,ebp
20 0042600E pop ebp
21 0042600F ret
  我們看看第7行,把ecx寄存器入棧,后面4行初始化了函數的堆棧中的保存局部變量的部分。第12行彈出ecx值,到這里時(shí)ecx的值保持為在函數調用前存入的對象內存地址,第13行就是保存this指針的值,作為一個(gè)局部變量。這樣我們就知道了VC7.1不是象傳遞普通函數那樣通過(guò)壓棧來(lái)傳遞this指針,而是通過(guò)ecx寄存器來(lái)傳遞。第14、15行利用這個(gè)this指針給對象的成員變量進(jìn)行了賦值。
  再看看靜態(tài)成員函數調用的匯編代碼:
00422E14 call 0041DD84
  非常直接,因為它不需要處理this指針,跟蹤到函數的匯編代碼,可以看到同樣不需要處理this指針。具體的代碼這里就不列出來(lái)了。
  再看看通過(guò)指針調用普通成員函數pt->foo();,產(chǎn)生的匯編代碼如下:
00422E25 mov ecx,dword ptr [ebp+FFFFF958h]
00422E2B call 0041E289
  和通過(guò)對象調用普通成員函數的代碼差不多。不過(guò)存對象地址到ecx寄存器地,是通過(guò)解引用pt指針來(lái)找到對象地址的。

  (未完待續)

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1777629

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C++虛函數調用的反匯編解析
深入研究constructor / destructor與operator new / delete (轉)
VC2008多重繼承下的Virtual Functions:Adjustor Thunk技術(shù)
怎樣查看lib文件中的函數名和函數參數啊
If-else與三目運算符的區別
C語(yǔ)言?xún)?yōu)先級和(i ) (i )與( i) ( i)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久