那位高手讲讲C++中动态联编的执行机制是怎样的

 我来答
百度网友ec9719df53
2018-05-11 · TA获得超过664个赞
知道小有建树答主
回答量:322
采纳率:95%
帮助的人:208万
展开全部

这个内容有点小多,我就不深入说了,因为那样会耗费很长的时间。简单说来静态联编就是编译器能够在编译期进行决策,这样函数调用都预先确定的;动态联编是编译器无法在编译期决定哪一个函数被调用,只有到运行期才能分辨出来。一个典型的应用的就是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 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式