您的位置:首页 > 其它

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

2016-04-08 20:35 288 查看
原博地址:http://blog.sina.com.cn/s/blog_701d49650100sg8f.html

C/C++很有用的基础知识。

联编指语言实现过程中合并模块、函数等代码单元生成可执行代码调用的处理过程,通常会明确地确定对每个模块、函数调用的存储器地址,把外部对它们的访问绑定正确的地址上。可以把联编分为两种类型,静态联编和动态联编。前者在编译期就确定了函数调用和函数实现之间的联系,一个调用对应具体的函数调用的所有信息;而后者在编译期中并没有完全确定调用的函数信息,在运行期中才根据运行状态判断应该调用哪个函数,怎样传入参数。

迟后联编(或者称为晚绑定)是典型的动态联编。在C 中,这种方式在编译期不确定具体调用的函数(不过编译期静态检查会确定地限制可选的函数的类型),在运行期中根据指针或引用实际所指的对象的类型信息来判断调用哪个函数,以实现类的非静态成员函数的多态性。具体而言,当基类的指针或引用指向派生类的实例时,通过指针或引用调用一个成员函数,若在基类和实际被指向的对象所属的派生类存在同名且类型相同的函数,会调用派生类中的版本。由于指针或引用可能指向属于不同的类的对象,并不能在编译时完全确定,因此必须在运行期中确定,需要使用迟后联编。一般实现隐藏在对象隐含的一个指针——vptr(虚指针)中,vptr指向vtable(虚表),vtable和类(而不是类的实例)直接相关,包含了在编译期确定的可能被选择的函数(即virtual成员函数/虚函数)入口地址/偏移表(典型地,是一个数组)。此外,在虚继承中,可能还会有vbtbl(虚基类表)和vbptr(虚指针),用来储存虚基类信息,在运行期中确定具体应该选择的vtable——这也属于迟后联编。(有些实现会把vbtbl、vbptr和vtable、vptr合并。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: