欢迎访问 生活随笔!

ag凯发k8国际

当前位置: ag凯发k8国际 > 编程资源 > 编程问答 >内容正文

编程问答

关于静态联编和动态联编 -ag凯发k8国际

发布时间:2024/10/14 编程问答 15 豆豆
ag凯发k8国际 收集整理的这篇文章主要介绍了 关于静态联编和动态联编 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

首先什么是联编?
通俗的来说联编就是函数调用(操作调用)与执行该操作(函数)的代码段之间的映射关系。
按照联编所进行的阶段不同可分为静态联编和动态联编
举个列子

#include using namespace std; class a{public:void fun(){cout<<"123"<<endl; } }; class b{public:void fun(){cout<<"123"<<endl; } }; int main() {fun(); }

a和b中都有都有fun()这个函数,现在在主函数里边调用;
那么a和b里边fun()就是执行该操作的代码段
联编就是决定main函数中的fun()函数调用映射到a中还是b中fun()的过程 ;

静态联编
是指联编工作是在程序编译连接阶段进行的,又被称为早期联编;因为这种编联是在程序开始运行之前完成的;
用上边例子说静态联编就是在编译的时候就决定了main函数中是调用a中还是b的fun()函数一旦编译完成,它们的映射关系就唯一确定了
上边那个例子是不能运行的方便理解,接下来用下一个实例

#include using namespace std; class shape{public:void draw(){cout<<"123456"<<endl; }void fun(){draw();} }; class circle:public shape{public:void draw(){cout<<"abcdefg"<<endl;} }; int main() {circle a;a.fun();return 0; }

这里有一个问题,它到底调用的是哪一个draw 函数
结果是,调用shape里边的;
为什么?
由于没有另外的数据结构来保存draw的地址,所以程序所知道的也只有fun函数所在的那个类里边的成员,自然会调用shape里边的draw;

动态编联
是指编译阶段并不确切知道将要调用的函数,只有在程序执行时才能确定将要调用的函数,要求联编工作在程序运行时进行联编工作称为动态联编c 规定动态联编是在虚函数支持下确定的;
这个也举个例子

#include using namespace std; class shape{public:virtual void draw(){cout<<"123456"<<endl; }void fun(){draw();} }; class circle:public shape{public:void draw(){cout<<"abcdefg"<<endl;} }; int main() {circle a;a.fun();return 0; }

虚函数是动态联编的基础
以上函数运行结果会和静态联编的那个例子不同就是因为在运行阶段会读到了virtual才会找到派生类的draw
在程序运行时进行关联或束定调用关系

与50位技术专家面对面20年技术见证,附赠技术全景图

总结

以上是ag凯发k8国际为你收集整理的关于静态联编和动态联编的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得ag凯发k8国际网站内容还不错,欢迎将ag凯发k8国际推荐给好友。

网站地图