联编-迟后联编-先期联编

原博地址:http://blog.sina.com.cn/s/blog_701d49650100sg8f.html
C/C++很有用的基础知识。

  • 联编指语言实现过程中合并模块、函数等代码单元生成可执行代码调用的处理过程,通常会明确地确定对每个模块、函数调用的存储器地址,把外部对它们的访问绑定正确的地址上。可以把联编分为两种类型,静态联编和动态联编。前者在编译期就确定了函数调用和函数实现之间的联系,一个调用对应具体的函数调用的所有信息;而后者在编译期中并没有完全确定调用的函数信息,在运行期中才根据运行状态判断应该调用哪个函数,怎样传入参数。
  • 迟后联编(或者称为晚绑定)是典型的动态联编。在C 中,这种方式在编译期不确定具体调用的函数(不过编译期静态检查会确定地限制可选的函数的类型),在运行期中根据指针或引用实际所指的对象的类型信息来判断调用哪个函数,以实现类的非静态成员函数的多态性。具体而言,当基类的指针或引用指向派生类的实例时,通过指针或引用调用一个成员函数,若在基类和实际被指向的对象所属的派生类存在同名且类型相同的函数,会调用派生类中的版本。由于指针或引用可能指向属于不同的类的对象,并不能在编译时完全确定,因此必须在运行期中确定,需要使用迟后联编。一般实现隐藏在对象隐含的一个指针——vptr(虚指针)中,vptr指向vtable(虚表),vtable和类(而不是类的实例)直接相关,包含了在编译期确定的可能被选择的函数(即virtual成员函数/虚函数)入口地址/偏移表(典型地,是一个数组)。此外,在虚继承中,可能还会有vbtbl(虚基类表)和vbptr(虚指针),用来储存虚基类信息,在运行期中确定具体应该选择的vtable——这也属于迟后联编。(有些实现会把vbtbl、vbptr和vtable、vptr合并。)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值