动态联编和静态联编

本文介绍了联编的概念,包括静态联编和动态联编。静态联编在编译链接阶段完成,速度快但灵活性差;动态联编在运行时确定函数调用,灵活性强但速度较慢。通过实例代码解析了动态联编过程,强调了虚函数在多态中的作用。
摘要由CSDN通过智能技术生成

联编概念

联编是指计算机程序自身彼此关联的过程。通常指把一个被调用的函数的代码连接到要运行的程序的过程,实际上就是将一个标识符与一个存储地址联系起来的过程。简单的说就是将带调用程序的函数的代码连接到该程序上。

静态联编

静态联编是指联编工作出现在编译链接阶段,又称之为早期联编。这种联编过程是在程序开始运行之前完成的,所以也称之为静态束定。
特点:速度快,灵活性差。

动态联编

在编译阶段并不知道确切要调用什么函数,只有在程序运行时才能确定要调用的函数。为此,联编就要求在程序运行时进行。这种在程序运行时进行联编的工作称为动态联编。
注:如果一个函数被声明为虚函数,就意味着这个函数可以在派生类中有不同的实现。当使用这个成员函数作为指针或者引用所标识的对象时,对该函数采取动态联编方式。
特点:速度较慢,效率高,灵活性较强。

深入理解联编的过程

先看如下的代码:

class Base
{
public :
     virtual void func1()
    {
          cout<<"Base::func1" <<endl;
    }

     virtual void func2()
    {
          cout<<"Base::func2" <<endl;
    }

     void display ()
    {
          cout<<"display()" <<endl;
    }

     void display (int i)
    {
          cout<<"display(int i)->" <<i<< endl;
    }

private :
     int a ;
};

class Derive :public Base
{
public :
     virtual void func1()
    {
          cout<<"Derive::func1" <<endl;
    }

private :
     int b ;
};

void func (Base& b)//注意这里就要区分动态和静态联编过程了
{
     b.func1 ();
     //b.func2();
     b.display ();
     b.display (10);
}

void Test1 ()
{
     Base b1 ;
     Derive d1 ;
     func(b1 );
     func(d1 );
}

先说这里存在的问题再来解释联编过程

问题:
在 Test函数里面定义了两个对象在,func(b1)这个函数,没什么说的它将调用所有基类的成员函数。
在func(d1)这个函数里面,它的func1调用的是子类Drive的func1,因为这个函数声明为virtual,所以它调用过程是动态联编,所以它被关联到Drive : : func1( ) 这个函数。接下来调用display函数时,它是静态联编,因此要被关联到基类的成员函数里面。

联编过程
这里写图片描述
可以看到在调用display函数的时候直接就确定了函数地址,而在调用func1时(这是个虚函数),需要先去虚表里面找取这个函数的地址,然后找到这个函数,再去确定这个函数。因此,当传给他子类的对象时,它找到的是子类虚表里面的函数。
对于上述动态联编汇编去确定取得函数解释如下图
这里写图片描述

总结

静态联编就是重载,因为是在编译期决议确定,所以称为静态联编。
动态多联编就是通过继承重写基类的虚函数实现的多态,因为是在运行时决议确定,所以称为动态多态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值