中易网

什么叫做迟后联编?

答案:5  悬赏:10  
解决时间 2021-01-12 03:01
什么叫做迟后联编?
最佳答案
联编指语言实现过程中合并模块、函数等代码单元生成可执行代码调用的处理过程,通常会明确地确定对每个模块、函数调用的存储器地址,把外部对它们的访问绑定正确的地址上。可以把联编分为两种类型,静态联编和动态联编。前者在编译期就确定了函数调用和函数实现之间的联系,一个调用对应具体的函数调用的所有信息;而后者在编译期中并没有完全确定调用的函数信息,在运行期中才根据运行状态判断应该调用哪个函数,怎样传入参数。
迟后联编(或者称为晚绑定)是典型的动态联编。在C++中,这种方式在编译期不确定具体调用的函数(不过编译期静态检查会确定地限制可选的函数的类型),在运行期中根据指针或引用实际所指的对象的类型信息来判断调用哪个函数,以实现类的非静态成员函数的多态性。具体而言,当基类的指针或引用指向派生类的实例时,通过指针或引用调用一个成员函数,若在基类和实际被指向的对象所属的派生类存在同名且类型相同的函数,会调用派生类中的版本。由于指针或引用可能指向属于不同的类的对象,并不能在编译时完全确定,因此必须在运行期中确定,需要使用迟后联编。一般实现隐藏在对象隐含的一个指针——vptr(虚指针)中,vptr指向vtable(虚表),vtable和类(而不是类的实例)直接相关,包含了在编译期确定的可能被选择的函数(即virtual成员函数/虚函数)入口地址/偏移表(典型地,是一个数组)。此外,在虚继承中,可能还会有vbtbl(虚基类表)和vbptr(虚指针),用来储存虚基类信息,在运行期中确定具体应该选择的vtable——这也属于迟后联编。(有些实现会把vbtbl、vbptr和vtable、vptr合并。)
====
[原创回答团]参考资料:原创
全部回答
希望对楼主有用
函数的联编:在编译或运行将函数调用与相应的函数体连接在一起的过程。
1 先期联编或静态联编:在编译时就能进行函数联编称为先期联编或静态联编。
2 迟后联编或动态联编:在运行时才能进行的联编称为迟后联编或动态联编。
那么联编与虚函数有什么关系呢,当然,造成上面例子中的矛盾的原因就是代码的联编过程采用了先期联编,使得编译时系统无法确定究竟应该调用基类中的函数还是应该调用派生类中的函数,要是能够采用上面说的迟后联编就好了,可以在运行时再判断到底是哪个对象,所以,virtual关键字的作用就是提示编译器进行迟后联编,告诉连接过程:“我是个虚的,先不要连接我,等运行时再说吧”。
那么为什么连接的时候就知道到底是哪个对象了呢,这就引出虚函数的原理了:当编译器遇到virtual后,会为所在的类构造一个表和一个指针,那个表叫做vtbl,每个类都有自己的vtbl,vtbl的作用就是保存自己类中虚函数的地址,我们可以把vtbl形象地看成一个数组,这个数组的每个元素存放的就是虚函数的地址.指针叫做vptr,指向那个表。而这个指针保存在相应的对象当中,也就是说只有创建了对象以后才能找到相应虚函数的地址。
对于模板类也是同理
只有当你的程序中出现了模板类的声明后
程序才对模板类进行编译
就是动态链接的意思。
就是等到运行时才进行编译
例如虚函数
它要等到运行后才知道它是指向哪个地址
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
乌龟与大象
帮我估计这个跑跑卡丁车号大概的价格
在昨天晚上 用英语怎么说
一个人要看过几次爱凋落、才甘心在孤独里冬眠
分别回顾和展望过去和未来各5年生活家里的生
xiao1234改成什么了
有什么软件才能照出这样的照片
目前为止,中超球员在本届世界杯中进球的球员
孤单的我似在扮傻,其实我心中不好过是那首歌
6千克鸡蛋54元钱,1千克鸡蛋多少元钱?
十年塑木,百年塑人,是什么修词手法
昨天用还好的,今天所有的EXCEL都突然变成只
本人曾离异,再婚后公安局要把户口本写再婚,
亚布力大锅盔怎么样
评职称核心书评有用吗
推荐资讯
能玩魔兽世界的笔记本推荐几款~
你好,请问392+417估算怎么算,谢谢
如何成为一个后防统帅
换万城移动营业厅地址在哪,我要去那里办事
求一部女主是天刹组织的首领的言情小说
去太原南中环清控创业基地a座怎么走
果宝商城怎么玩,是骗人的吗,怎么分析?
为什么我夜夜多梦?!怎样可以解决~
软皮面的大包包皱褶的厉害,如何使其平展?
什么是封闭水域
穿汉服应如何配包?
求电影名,讲诉一个飞船落入海底,人们从太空
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?