0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

引入虛繼承后會(huì)造成怎樣的影響

電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2018-10-09 09:56 ? 次閱讀

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

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

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

結(jié)果如下:

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

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

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

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

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

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

非常直接,因?yàn)樗恍枰幚韙his指針,跟蹤到函數(shù)的匯編代碼,可以看到同樣不需要處理this指針。具體的代碼這里就不列出來(lái)了。

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5295

    瀏覽量

    119834
  • 打印
    +關(guān)注

    關(guān)注

    1

    文章

    64

    瀏覽量

    18683
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1617

    瀏覽量

    49016
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    蓄電池在充放電時(shí)AD采樣到的值低,怎樣解決?

    有沒(méi)有人做過(guò)蓄電池充放電檢測(cè)的,怎樣檢測(cè)蓄電池的實(shí)際值,充放電時(shí)會(huì)低,測(cè)的不準(zhǔn)啊,求助
    發(fā)表于 07-21 09:14

    Python多重繼承使用方法

    繼承是面向?qū)ο缶幊痰囊粋€(gè)重要方式,通過(guò)繼承,子類可以擴(kuò)展父類的功能,Python也具有該特性,除此之外,Python還可以使用多重繼承。語(yǔ)法:class subClass(Base1,Base2)該
    發(fā)表于 04-19 14:41

    C++ 多繼承基類分享

    /details/1027495131.多繼承派生類有多個(gè)基類或者基類,同一個(gè)類不能多次作為某個(gè)派生類的直接基類,但可以作為一個(gè)派生類的間接基類;class QUEUE: STACK, STACK{...
    發(fā)表于 07-02 06:54

    淺析多繼承派生類中的基類

    繼承派生類與基類有何關(guān)系?多繼承派生類與基類有何關(guān)系?
    發(fā)表于 09-30 06:26

    什么是繼承?

    什么是繼承?繼承是子類利用父類中定義的方法和變量就像它們屬于子類本身一樣. class Car {   int color_number;&n
    發(fā)表于 04-28 14:26 ?714次閱讀

    電路,電路的特點(diǎn),電路的原理是什么?

    電路,電路的特點(diǎn),電路的原理是什么? 電路是交換網(wǎng)絡(luò)(ATM、幀中繼、IP或因特網(wǎng))上兩個(gè)終端站之間的點(diǎn)對(duì)點(diǎn)通信鏈路。電路
    發(fā)表于 03-18 14:52 ?9143次閱讀

    短和斷的概念

    短和斷的概念
    發(fā)表于 12-30 14:37 ?8次下載

    短和斷概念剖解及應(yīng)用實(shí)例

    短指在理想情況下,兩個(gè)輸入端的電位相等,就好像兩個(gè)輸入端短接在一起,但事實(shí)上并沒(méi)有短接,稱為“短”。短的必要條件是運(yùn)放引入深度負(fù)反饋。
    發(fā)表于 03-16 14:48 ?1.7w次閱讀

    顯卡焊癥狀是怎樣的_顯卡焊自己怎么修

    顯卡焊是指顯卡芯片的BGA焊點(diǎn)與主板接觸不良,一般是由于顯卡高溫導(dǎo)致的。
    發(fā)表于 04-09 09:03 ?15.9w次閱讀
    顯卡<b class='flag-5'>虛</b>焊癥狀是<b class='flag-5'>怎樣</b>的_顯卡<b class='flag-5'>虛</b>焊自己怎么修

    PCBA加工中造成焊的原因及解決方法

    PCBA焊也就是常說(shuō)的冷焊,表面看起來(lái)焊連了,但實(shí)際內(nèi)部并沒(méi)有通,或者處于可能通也可能不通的中間不穩(wěn)定狀態(tài),影響電路特性,可能會(huì)造成PCB板質(zhì)量不合格或者報(bào)廢。因此對(duì)于PCBA焊現(xiàn)象要重視,下面就為大家介紹PCBA
    的頭像 發(fā)表于 03-06 11:07 ?8499次閱讀

    一文詳解函數(shù)及其相關(guān)知識(shí)點(diǎn)

    本期是C++基礎(chǔ)語(yǔ)法分享的第七節(jié),今天給大家來(lái)分享一下: (1)析構(gòu)函數(shù); (2)純函數(shù); (3)函數(shù)、純函數(shù); (4)函數(shù)指針、
    的頭像 發(fā)表于 10-13 10:14 ?7864次閱讀

    怎樣在Java中實(shí)現(xiàn)多繼承

    Java是一種面向?qū)ο蟮闹辉试S單繼承的語(yǔ)言,那么怎樣在Java中實(shí)現(xiàn)多繼承呢? 2 方法 1. 多層繼承 如果要直接繼承類,子類
    的頭像 發(fā)表于 02-17 14:55 ?1279次閱讀

    什么是焊假焊?造成焊假焊的原因有哪些?

    焊是指元件引腳、焊端、PCB焊盤處上錫不充分,焊錫在此處的潤(rùn)濕角大于90°,而且只有少量的焊錫潤(rùn)濕引腳、焊端、PCB焊盤,造成接觸不良而時(shí)通時(shí)斷。
    的頭像 發(fā)表于 02-24 16:29 ?2.1w次閱讀

    為什么運(yùn)放會(huì)有斷?

    為什么運(yùn)放會(huì)有斷?? 運(yùn)放是集成電路的一種,主要用于信號(hào)放大和處理。在實(shí)際使用過(guò)程中,可能會(huì)發(fā)現(xiàn)運(yùn)放出現(xiàn)斷這種現(xiàn)象,這是由于多種因素造成
    的頭像 發(fā)表于 09-20 16:29 ?1086次閱讀

    造成焊、假焊的原因有哪些?如何預(yù)防焊假焊

    虛焊 假焊 是在SMT貼片加工 中經(jīng)常出現(xiàn)的不良現(xiàn)象,今天小編就給大家講講什么是焊、假焊?造成焊、假焊的原因有哪些?該如何預(yù)防焊假焊。 一、什么是
    的頭像 發(fā)表于 04-13 11:28 ?3458次閱讀
    <b class='flag-5'>造成</b><b class='flag-5'>虛</b>焊、假焊的原因有哪些?如何預(yù)防<b class='flag-5'>虛</b>焊假焊