C++對象布局及多態(tài)實現(xiàn)之動態(tài)和強制轉(zhuǎn)換
出處:tjzdh 發(fā)布于:2008-08-21 11:49:41
下面我們看看引入虛繼承后的影響。為了有所對比我們首先看看普通成員函數(shù)的調(diào)用情況。
執(zhí)行如下代碼,它包括了對象的普通成員函數(shù)調(diào)用,類的靜態(tài)成員函數(shù)調(diào)用、通過指針調(diào)用普通成員函數(shù):
|
結(jié)果如下:
|
這是obj對象的內(nèi)存地址。
首先我們看看對象的普通成員函數(shù)調(diào)用,obj.foo();,對應(yīng)的匯編代碼為:
|
第1行把對象的地址存入ecx寄存器,執(zhí)行完這行指令后,我們要以看到ecx中的值為0x0012F843,就是前面打印出的值。如果函數(shù)需要傳遞參數(shù),我們還會在前面看到一些push指令。在第2行我們可以看到call的是一個直接的地址,這也就是靜態(tài)綁定。即函數(shù)的調(diào)用地址在編譯時已經(jīng)被編譯器決議。
跟蹤進去我們要以看到是一條跳轉(zhuǎn)指令,繼續(xù)執(zhí)行可以看到真正的函數(shù)代碼部分,如下(注:為了討論方便我在第行前面加了一個行號):
|
我們看看第7行,把ecx寄存器入棧,后面4行初始化了函數(shù)的堆棧中的保存局部變量的部分。第12行彈出ecx值,到這里時ecx的值保持為在函數(shù)調(diào)用前存入的對象內(nèi)存地址,第13行就是保存this指針的值,作為一個局部變量。這樣我們就知道了VC7.1不是象傳遞普通函數(shù)那樣通過壓棧來傳遞this 指針,而是通過ecx寄存器來傳遞。第14、15行利用這個this指針給對象的成員變量進行了賦值。
再看看靜態(tài)成員函數(shù)調(diào)用的匯編代碼:
|
非常直接,因為它不需要處理this指針,跟蹤到函數(shù)的匯編代碼,可以看到同樣不需要處理this指針。具體的代碼這里就不列出來了。
再看看通過指針調(diào)用普通成員函數(shù)pt-> foo();,產(chǎn)生的匯編代碼如下:
|
和通過對象調(diào)用普通成員函數(shù)的代碼差不多。不過存對象地址到ecx寄存器地,是通過解引用pt指針來找到對象地址的。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- EDA技術(shù)工具鏈與全流程設(shè)計運維指南2026/1/5 10:28:51
- PLC程序現(xiàn)場疑難問題排查與深度優(yōu)化指南2025/12/24 14:36:36
- PLC程序現(xiàn)場調(diào)試與優(yōu)化實操指南2025/12/24 14:29:57
- 工業(yè)PLC模擬量信號采集:調(diào)理技術(shù)與抗干擾工程方案2025/12/15 14:39:08
- PLC設(shè)備如何選型2025/9/5 17:15:14









