0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

引入虚继承后会造成怎样的影响

电子设计 作者:电子设计 2018-10-09 09:56 次阅读

从这部分开始我们除了利用内存的信息打印来进行探索外,更多的会通过跟踪和观察编译器产生的汇编代码来理解编译器对这些语言特性的实现方式。汇编方面知识的讨论超出了本文的范围,我只对和我们讨论相关的汇编代码进行解析。理解本文要讨论的知识并不需要有很完整的汇编知识,但必须了解起码的概念。

下面我们看看引入虚继承后的影响。为了有所对比我们首先看看普通成员函数的调用情况。

执行如下代码,它包括了对象的普通成员函数调用,类的静态成员函数调用、通过指针调用普通成员函数:

结果如下:

这是obj对象的内存地址。

首先我们看看对象的普通成员函数调用,obj.foo();,对应的汇编代码为:

第1行把对象的地址存入ecx寄存器,执行完这行指令后,我们要以看到ecx中的值为0x0012F843,就是前面打印出的值。如果函数需要传递参数,我们还会在前面看到一些push指令。在第2行我们可以看到call的是一个直接的地址,这也就是静态绑定。即函数的调用地址在编译时已经被编译器决议。

跟踪进去我们要以看到是一条跳转指令,继续执行可以看到真正的函数代码部分,如下(注:为了讨论方便我在第行前面加了一个行号):

我们看看第7行,把ecx寄存器入栈,后面4行初始化了函数的堆栈中的保存局部变量的部分。第12行弹出ecx值,到这里时ecx的值保持为在函数调用前存入的对象内存地址,第13行就是保存this指针的值,作为一个局部变量。这样我们就知道了VC7.1不是象传递普通函数那样通过压栈来传递this 指针,而是通过ecx寄存器来传递。第14、15行利用这个this指针给对象的成员变量进行了赋值。

再看看静态成员函数调用的汇编代码:

非常直接,因为它不需要处理this指针,跟踪到函数的汇编代码,可以看到同样不需要处理this指针。具体的代码这里就不列出来了。

再看看通过指针调用普通成员函数pt-》 foo();,产生的汇编代码如下:

和通过对象调用普通成员函数的代码差不多。不过存对象地址到ecx寄存器地,是通过解引用pt指针来找到对象地址的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5308

    浏览量

    119928
  • 打印
    +关注

    关注

    1

    文章

    64

    浏览量

    18690
  • 编译器
    +关注

    关注

    1

    文章

    1617

    浏览量

    49027
收藏 人收藏

    评论

    相关推荐

    蓄电池在充放电时AD采样到的值低,怎样解决?

    有没有人做过蓄电池充放电检测的,怎样检测蓄电池的实际值,充放电时会低,测的不准啊,求助
    发表于 07-21 09:14

    Python多重继承使用方法

    继承是面向对象编程的一个重要方式,通过继承,子类可以扩展父类的功能,Python也具有该特性,除此之外,Python还可以使用多重继承。语法:class subClass(Base1,Base2)该
    发表于 04-19 14:41

    C++ 多继承基类分享

    /details/1027495131.多继承派生类有多个基类或者基类,同一个类不能多次作为某个派生类的直接基类,但可以作为一个派生类的间接基类;class QUEUE: STACK, STACK{...
    发表于 07-02 06:54

    浅析多继承派生类中的基类

    继承派生类与基类有何关系?多继承派生类与基类有何关系?
    发表于 09-30 06:26

    什么是继承?

    什么是继承?继承是子类利用父类中定义的方法和变量就像它们属于子类本身一样. class Car {   int color_number;&n
    发表于 04-28 14:26 717次阅读

    电路,电路的特点,电路的原理是什么?

    电路,电路的特点,电路的原理是什么? 电路是交换网络(ATM、帧中继、IP或因特网)上两个终端站之间的点对点通信链路。电路
    发表于 03-18 14:52 9145次阅读

    短和断的概念

    短和断的概念
    发表于 12-30 14:37 8次下载

    短和断概念剖解及应用实例

    短指在理想情况下,两个输入端的电位相等,就好像两个输入端短接在一起,但事实上并没有短接,称为“短”。短的必要条件是运放引入深度负反馈。
    发表于 03-16 14:48 1.7w次阅读

    显卡焊症状是怎样的_显卡焊自己怎么修

    显卡焊是指显卡芯片的BGA焊点与主板接触不良,一般是由于显卡高温导致的。
    发表于 04-09 09:03 16w次阅读
    显卡<b class='flag-5'>虚</b>焊症状是<b class='flag-5'>怎样</b>的_显卡<b class='flag-5'>虚</b>焊自己怎么修

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

    PCBA焊也就是常说的冷焊,表面看起来焊连了,但实际内部并没有通,或者处于可能通也可能不通的中间不稳定状态,影响电路特性,可能会造成PCB板质量不合格或者报废。因此对于PCBA焊现象要重视,下面就为大家介绍PCBA
    的头像 发表于 03-06 11:07 8512次阅读

    一文详解函数及其相关知识点

    本期是C++基础语法分享的第七节,今天给大家来分享一下: (1)析构函数; (2)纯函数; (3)函数、纯函数; (4)函数指针、
    的头像 发表于 10-13 10:14 7869次阅读

    怎样在Java中实现多继承

    Java是一种面向对象的只允许单继承的语言,那么怎样在Java中实现多继承呢? 2 方法 1. 多层继承 如果要直接继承类,子类
    的头像 发表于 02-17 14:55 1282次阅读

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

    焊是指元件引脚、焊端、PCB焊盘处上锡不充分,焊锡在此处的润湿角大于90°,而且只有少量的焊锡润湿引脚、焊端、PCB焊盘,造成接触不良而时通时断。
    的头像 发表于 02-24 16:29 2.1w次阅读

    为什么运放会有断?

    为什么运放会有断?  运放是集成电路的一种,主要用于信号放大和处理。在实际使用过程中,可能会发现运放出现断这种现象,这是由于多种因素造成
    的头像 发表于 09-20 16:29 1091次阅读

    造成焊、假焊的原因有哪些?如何预防焊假焊

    虛焊 假焊 是在SMT贴片加工 中经常出现的不良现象,今天小编就给大家讲讲什么是焊、假焊?造成焊、假焊的原因有哪些?该如何预防焊假焊。 一、什么是
    的头像 发表于 04-13 11:28 3694次阅读
    <b class='flag-5'>造成</b><b class='flag-5'>虚</b>焊、假焊的原因有哪些?如何预防<b class='flag-5'>虚</b>焊假焊