中易网

什么叫做迟后联编?

答案:5  悬赏:10  
解决时间 2021-01-12 03:01
  • 提问者网友:低吟詩仙的傷
  • 2021-01-11 21:26
什么叫做迟后联编?
最佳答案
  • 二级知识专家网友:长青诗
  • 2021-01-11 22:49
联编指语言实现过程中合并模块、函数等代码单元生成可执行代码调用的处理过程,通常会明确地确定对每个模块、函数调用的存储器地址,把外部对它们的访问绑定正确的地址上。可以把联编分为两种类型,静态联编和动态联编。前者在编译期就确定了函数调用和函数实现之间的联系,一个调用对应具体的函数调用的所有信息;而后者在编译期中并没有完全确定调用的函数信息,在运行期中才根据运行状态判断应该调用哪个函数,怎样传入参数。
迟后联编(或者称为晚绑定)是典型的动态联编。在C++中,这种方式在编译期不确定具体调用的函数(不过编译期静态检查会确定地限制可选的函数的类型),在运行期中根据指针或引用实际所指的对象的类型信息来判断调用哪个函数,以实现类的非静态成员函数的多态性。具体而言,当基类的指针或引用指向派生类的实例时,通过指针或引用调用一个成员函数,若在基类和实际被指向的对象所属的派生类存在同名且类型相同的函数,会调用派生类中的版本。由于指针或引用可能指向属于不同的类的对象,并不能在编译时完全确定,因此必须在运行期中确定,需要使用迟后联编。一般实现隐藏在对象隐含的一个指针——vptr(虚指针)中,vptr指向vtable(虚表),vtable和类(而不是类的实例)直接相关,包含了在编译期确定的可能被选择的函数(即virtual成员函数/虚函数)入口地址/偏移表(典型地,是一个数组)。此外,在虚继承中,可能还会有vbtbl(虚基类表)和vbptr(虚指针),用来储存虚基类信息,在运行期中确定具体应该选择的vtable——这也属于迟后联编。(有些实现会把vbtbl、vbptr和vtable、vptr合并。)
====
[原创回答团]参考资料:原创
全部回答
  • 1楼网友:我住北渡口
  • 2021-01-12 02:15
希望对楼主有用
函数的联编:在编译或运行将函数调用与相应的函数体连接在一起的过程。
1 先期联编或静态联编:在编译时就能进行函数联编称为先期联编或静态联编。
2 迟后联编或动态联编:在运行时才能进行的联编称为迟后联编或动态联编。
那么联编与虚函数有什么关系呢,当然,造成上面例子中的矛盾的原因就是代码的联编过程采用了先期联编,使得编译时系统无法确定究竟应该调用基类中的函数还是应该调用派生类中的函数,要是能够采用上面说的迟后联编就好了,可以在运行时再判断到底是哪个对象,所以,virtual关键字的作用就是提示编译器进行迟后联编,告诉连接过程:“我是个虚的,先不要连接我,等运行时再说吧”。
那么为什么连接的时候就知道到底是哪个对象了呢,这就引出虚函数的原理了:当编译器遇到virtual后,会为所在的类构造一个表和一个指针,那个表叫做vtbl,每个类都有自己的vtbl,vtbl的作用就是保存自己类中虚函数的地址,我们可以把vtbl形象地看成一个数组,这个数组的每个元素存放的就是虚函数的地址.指针叫做vptr,指向那个表。而这个指针保存在相应的对象当中,也就是说只有创建了对象以后才能找到相应虚函数的地址。
对于模板类也是同理
  • 2楼网友:猎心人
  • 2021-01-12 02:08
只有当你的程序中出现了模板类的声明后
程序才对模板类进行编译
  • 3楼网友:爱难随人意
  • 2021-01-12 01:45
就是动态链接的意思。
  • 4楼网友:酒者煙囻
  • 2021-01-12 00:29
就是等到运行时才进行编译
例如虚函数
它要等到运行后才知道它是指向哪个地址
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息