
那位高手讲讲C++中动态联编的执行机制是怎样的
这个内容有点小多,我就不深入说了,因为那样会耗费很长的时间。简单说来静态联编就是编译器能够在编译期进行决策,这样函数调用都预先确定的;动态联编是编译器无法在编译期决定哪一个函数被调用,只有到运行期才能分辨出来。一个典型的应用的就是C++的虚函数机制,c++中使用基类指针p去调用虚函数是无法在编译期确定调用的是基类的函数还是派生类的函数的。 它只能在运行的时候根据p指针指向的实际对象(基类,或者是派生类)来决定调用(基类,或者是派生类)的虚函数。
class Shape
{
public:
virtual double area() {return 0.0;}
};
class Circle : public Shape
{
public
double area() { ...}
};
class Square: public Shape
{
public
double area() { ...}
};
例如上述的代码,有一个基类,两个派生类,以及虚函数area,我们如下使用
Shape * p = new Circle(); p->area(); //动态联编,调用Circle的area函数
Shape s; s.area(); //静态联编,调用Shape的area函数
可以看出,当使用基类指针p的时候,我们调用p->area()的时候,编译器并不能知道p指向的Circle对象(虽然这里可以知道),但是如果我们的p经过外面的函数传递参数传递过来的呢?在函数内部的参数类型中我们只能看到Shape* p。当执行到p->area()的时候,会先去找p指向的对象的前4个字节(一般是),它是一个指向vptr虚函数表的指针。进而进入到虚函数中,找到具体的函数,这里它就会是Circle的area函数。对于s.area(),它不会执行动态联编,因为它是使用对象访问的,对象是啥就是啥,不会有运行的检查,编译的时候直接就编译死是调用Shape的area函数。

2023-08-15 广告