静态联编和动态联编

本文介绍了C++中的静态联编与动态联编概念,解析了虚函数的工作原理及其实现机制,并讨论了使用虚函数的代价,包括对象大小增加、编译器创建虚函数表以及函数调用时的额外开销。

静态联编和动态联编

函数联编:编译器将源码中的函数调用解释为执行特定的函数代码块。

C++中由于重载,出函数名以外还要判断参数和类型。

 

静态联编

在编译过程中进行联编。

 

动态联编

由于使用虚函数,编译时不能确定用户选择哪种类型的对象。所以,编译器必须生成能在运行时选择正确虚方法的代码,即动态联编。

 

虚函数的工作原理:

Class A{

 

charname[40];

public:

virtualvoid test1();

virtualvoid test2();

 

}

 

class B:public A{

charfield[40];

public:

virtualvoid test1();

virtualvoid test2();//redefined

voidtest3();

 

 

}

A::test1    test2

  1000

1001

A的虚函数表vtbl

 

B::test1   test2       test3

 

1000

2001

1003

B的虚函数表

 

test2()由于重定义,地址变更。

 两个类中均有隐藏指针,指向虚函数表

 

只要使用虚函数,无论是几个,都只向对象中添加一个地址成员,表大小不同。

 

 

成本:

1.  每个对象都增大,增大量为存储地址的空间;

2.  每个类,编译器都创建一个虚函数地址表(数组);

3.      每个函数调用,额外到表中查找地址。

 

 

 

总结:

1.构造函数不能是虚函数。

2.析构函数应是虚函数。

3.友元不能是虚函数,因为它不是类成员。

4.重新定义将隐藏方法。它并不是重载,不能改变参数等。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值