c++中怎么理解动态联编和静态联编?
2个回答
展开全部
通常来说联编就是将模块或者函数合并在一起生成可执行代码的处理过程,同时对每个模块或者函数调用分配内存地址,并且对外部访问也分配正确的内存地址,它是计算机程序彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。
静态联编是指在编译阶段就将函数实现和函数调用关联起来,因此静态联编也叫早绑定,在编译阶段就必须了解所有的函数或模块执行所需要检测的信息,它对函数的选择是基于指向对象的指针的类型,C语言中,所有的联编都是静态联编,并且任何一种编译器都支持静态联编。
动态联编是指在程序执行的时候才将函数实现和函数调用关联,因此也叫运行时绑定或者晚绑定,动态联编对函数的选择不是基于指针或者引用,而是基于对象类型,不同的对象类型将做出不同的编译结果。C++中一般情况下联编也是静态联编,但是一旦涉及到多态和虚拟函数就必须要使用动态联编了。
多态联编:字面的含义是具有多种形式或形态。C++多态有两种形式,动态多态和静态多态;动态多态是指一般的多态,是通过类继承和虚函数机制实现的多态;静态多态是通过模板来实现,因为这种多态实在编译时而非运行时,所以称为静态多态。
Storm代理
2023-08-29 广告
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I...
点击进入详情页
本回答由Storm代理提供
展开全部
转一个西部数码的:
联编是指一个电脑程式自身彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。
静态联编
静态联编是指联编工作出现在编译连接阶段,这种联编又称早期联编,因为这种联编过程是在程式开始运行之前完成的。
在编译时所进行的这种联编又称静态束定。在编译时就解决了程式中的操作调用和执行该操作代码间的关系,确定这种关系又称为束定,在编译时束定又称静态束定。下面举一个静态联编的例子。
#include
class Point
{
public:
Point(double i, double j) { x=i; y=j; }
double Area() const { return 0.0; }
private:
double x, y;
};
class Rectangle:public Point
{
public:
Rectangle(double i, double j, double k, double l);
double Area() const { return w*h; }
private:
double w, h;
};
Rectangle::Rectangle(double i, double j, double k, double l):Point(i, j)
{
w=k; h=l;
}
void fun(Point &s)
{
cout< }
void main()
{
Rectangle rec(3.0, 5.2, 15.0, 25.0);
fun(rec);
}
该程式的运行结果为:
0
输出结果表明在fun()函数中,s所引用的对象执行的Area()操作被关联到Point::Area()的实现代码上。这是因为静态联编的结果。在程式编译阶段,对s所引用的对象所执行的Area()操作只能束定到Point类的函数上。因此,导致程式输出了所不期望的结果。因为我们期望的是s引用的对象所执行的Area()操作应该束定到Rectangl类的Area()函数上。这是静态联编所达不到的。
动态联编
从对静态联编的上述分析中能够知道,编译程式在编译阶段并不能确切知道将要调用的函数,只有在程式执行时才能确定将要调用的函数,为此要确切知道该调用的函数,需要联编工作要在程式运行时进行,这种在程式运行时进行联编工作被称为动态联编,或称动态束定,又叫晚期联编。
动态联编实际上是进行动态识别。在上例中,前面分析过了静态联编时,fun()函数中s所引用的对象被束定到Point类上。而在运行时进行动态联编将把s的对象引用束定到Rectangle类上。可见,同一个对象引用s,在不同阶段被束定的类对象将是不同的。那么如何来确定是静态联编还是动态联编呢?C 规定动态联编是在虚函数的支持下实现的。
从上述分析能够看出静态联编和动态联编也都是属于多态性的,他们是不同阶段对不同实现进行不同的选择。上例中,实现上是对fun()函数参数的多态性的选择。该函数的参数是个类的对象引用,静态联编和动态联编和动态联编实际上是在选择他的静态类型和动态类型。联编是对这个引用的多态性的选择。
联编是指一个电脑程式自身彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。
静态联编
静态联编是指联编工作出现在编译连接阶段,这种联编又称早期联编,因为这种联编过程是在程式开始运行之前完成的。
在编译时所进行的这种联编又称静态束定。在编译时就解决了程式中的操作调用和执行该操作代码间的关系,确定这种关系又称为束定,在编译时束定又称静态束定。下面举一个静态联编的例子。
#include
class Point
{
public:
Point(double i, double j) { x=i; y=j; }
double Area() const { return 0.0; }
private:
double x, y;
};
class Rectangle:public Point
{
public:
Rectangle(double i, double j, double k, double l);
double Area() const { return w*h; }
private:
double w, h;
};
Rectangle::Rectangle(double i, double j, double k, double l):Point(i, j)
{
w=k; h=l;
}
void fun(Point &s)
{
cout< }
void main()
{
Rectangle rec(3.0, 5.2, 15.0, 25.0);
fun(rec);
}
该程式的运行结果为:
0
输出结果表明在fun()函数中,s所引用的对象执行的Area()操作被关联到Point::Area()的实现代码上。这是因为静态联编的结果。在程式编译阶段,对s所引用的对象所执行的Area()操作只能束定到Point类的函数上。因此,导致程式输出了所不期望的结果。因为我们期望的是s引用的对象所执行的Area()操作应该束定到Rectangl类的Area()函数上。这是静态联编所达不到的。
动态联编
从对静态联编的上述分析中能够知道,编译程式在编译阶段并不能确切知道将要调用的函数,只有在程式执行时才能确定将要调用的函数,为此要确切知道该调用的函数,需要联编工作要在程式运行时进行,这种在程式运行时进行联编工作被称为动态联编,或称动态束定,又叫晚期联编。
动态联编实际上是进行动态识别。在上例中,前面分析过了静态联编时,fun()函数中s所引用的对象被束定到Point类上。而在运行时进行动态联编将把s的对象引用束定到Rectangle类上。可见,同一个对象引用s,在不同阶段被束定的类对象将是不同的。那么如何来确定是静态联编还是动态联编呢?C 规定动态联编是在虚函数的支持下实现的。
从上述分析能够看出静态联编和动态联编也都是属于多态性的,他们是不同阶段对不同实现进行不同的选择。上例中,实现上是对fun()函数参数的多态性的选择。该函数的参数是个类的对象引用,静态联编和动态联编和动态联编实际上是在选择他的静态类型和动态类型。联编是对这个引用的多态性的选择。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询