国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C++對象布局及多態實現之成員函數的調用

2019-11-17 05:09:22
字體:
來源:轉載
供稿:網友
從這部分開始我們除了利用內存的信息打印來進行探索外,更多的會通過跟蹤和觀察編譯器產生的匯編代碼來理解編譯器對這些語言特性的實現方式。匯編方面知識的討論超出了本文的范圍,我只對和我們討論相關的匯編代碼進行解析。
理解本文要討論的知識并不需要有很完整的匯編知識,但必須了解起碼的概念。 下面我們看看引入虛繼續后的影響。為了有所對比我們首先看看普通成員函數的調用情況。 執行如下代碼,它包括了對象的普通成員函數調用,類的靜態成員函數調用、通過指針調用普通成員函數: 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,就是前面打印出的值。假如函數需要傳遞參數,我們還會在前面看到一些push指令。在第2行我們可以看到call的是一個直接的地址,這也就是靜態綁定。即函數的調用地址在編譯時已經被編譯器決議。 跟蹤進去我們要以看到是一條跳轉指令,繼續執行可以看到真正的函數代碼部分,如下(注:為了討論方便我在第行前面加了一個行號):   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   7 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   9 0042600C mov esp,ebp   20 0042600E pop ebp   21 0042600F ret
我們看看第7行,把ecx寄存器入棧,后面4行初始化了函數的堆棧中的保存局部變量的部分。第12行彈出ecx值,到這里時ecx的值保持為在函數調用前存入的對象內存地址,第13行就是保存this指針的值,作為一個局部變量。這樣我們就知道了VC7.1不是象傳遞普通函數那樣通過壓棧來傳遞this 指針,而是通過ecx寄存器來傳遞。第14、15行利用這個this指針給對象的成員變量進行了賦值。 再看看靜態成員函數調用的匯編代碼:      00422E14 call 0041DD84 非常直接,因為它不需要處理this指針,跟蹤到函數的匯編代碼,可以看到同樣不需要處理this指針。具體的代碼這里就不列出來了。 再看看通過指針調用普通成員函數pt->foo();,產生的匯編代碼如下:    00422E25 mov ecx,dword ptr [ebp+FFFFF958h]    00422E2B call 0041E289 和通過對象調用普通成員函數的代碼差不多。不過存對象地址到ecx寄存器地,是通過解引用pt指針來找到對象地址的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泉州市| 明水县| 新营市| 芜湖市| 海伦市| 视频| 明星| 淳化县| 商河县| 彰化县| 翁源县| 吴江市| 凌源市| 中西区| 富蕴县| 扎囊县| 鹤壁市| 新丰县| 昌邑市| 达拉特旗| 舟曲县| 金山区| 清远市| 黔西县| 铁力市| 昭觉县| 乌苏市| 从江县| 奉节县| 固安县| 中卫市| 紫金县| 孝感市| 凤城市| 涟水县| 博兴县| 荥经县| 泽普县| 泽普县| 田东县| 田东县|