关于静态联编和动态联编

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

#include<iostream>
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<iostream>
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<iostream>
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
在程序运行时进行关联或束定调用关系

发布了37 篇原创文章 · 获赞 52 · 访问量 1843

猜你喜欢

转载自blog.csdn.net/qq_45737068/article/details/103801257