日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

C++對象布局及多態(tài)實現(xiàn)之動態(tài)和強制轉(zhuǎn)換

出處:tjzdh 發(fā)布于:2008-08-21 11:49:41

  從這部分開始我們除了利用內(nèi)存的信息打印來進行探索外,更多的會通過跟蹤和觀察編譯器產(chǎn)生的匯編代碼來理解編譯器對這些語言特性的實現(xiàn)方式。匯編方面知識的討論超出了本文的范圍,我只對和我們討論相關(guān)的匯編代碼進行解析。理解本文要討論的知識并不需要有很完整的匯編知識,但必須了解起碼的概念。

  下面我們看看引入虛繼承后的影響。為了有所對比我們首先看看普通成員函數(shù)的調(diào)用情況。

  執(zhí)行如下代碼,它包括了對象的普通成員函數(shù)調(diào)用,類的靜態(tài)成員函數(shù)調(diào)用、通過指針調(diào)用普通成員函數(shù):

C010 obj;
            PRINT_OBJ_ADR(obj)
            obj.foo();
            C012::sfoo();
            C010 * pt = &obj;
            pt-> foo();

  結(jié)果如下:

obj's address is : 0012F843

  這是obj對象的內(nèi)存地址。

  首先我們看看對象的普通成員函數(shù)調(diào)用,obj.foo();,對應(yīng)的匯編代碼為:

00422E09 lea ecx,[ebp+FFFFF967h]
            00422E0F call 0041E289

  

第1行把對象的地址存入ecx寄存器,執(zhí)行完這行指令后,我們要以看到ecx中的值為0x0012F843,就是前面打印出的值。如果函數(shù)需要傳遞參數(shù),我們還會在前面看到一些push指令。在第2行我們可以看到call的是一個直接的地址,這也就是靜態(tài)綁定。即函數(shù)的調(diào)用地址在編譯時已經(jīng)被編譯器決議。

  跟蹤進去我們要以看到是一條跳轉(zhuǎn)指令,繼續(xù)執(zhí)行可以看到真正的函數(shù)代碼部分,如下(注:為了討論方便我在第行前面加了一個行號):

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行初始化了函數(shù)的堆棧中的保存局部變量的部分。第12行彈出ecx值,到這里時ecx的值保持為在函數(shù)調(diào)用前存入的對象內(nèi)存地址,第13行就是保存this指針的值,作為一個局部變量。這樣我們就知道了VC7.1不是象傳遞普通函數(shù)那樣通過壓棧來傳遞this 指針,而是通過ecx寄存器來傳遞。第14、15行利用這個this指針給對象的成員變量進行了賦值。

  再看看靜態(tài)成員函數(shù)調(diào)用的匯編代碼:

00422E14 call 0041DD84

非常直接,因為它不需要處理this指針,跟蹤到函數(shù)的匯編代碼,可以看到同樣不需要處理this指針。具體的代碼這里就不列出來了。

  再看看通過指針調(diào)用普通成員函數(shù)pt-> foo();,產(chǎn)生的匯編代碼如下:

00422E25 mov ecx,dword ptr [ebp+FFFFF958h]
            00422E2B call 0041E289

和通過對象調(diào)用普通成員函數(shù)的代碼差不多。不過存對象地址到ecx寄存器地,是通過解引用pt指針來找到對象地址的。



  
關(guān)鍵詞:C++對象布局及多態(tài)實現(xiàn)之動態(tài)和強制轉(zhuǎn)換C012C010C++

版權(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)利。

低電流寬帶錐形電感(ZGC010TD47K70)
廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!