函数联编:编译器将源码中的函数调用解释为执行特定的函数代码块。
但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.重新定义将隐藏方法。它并不是重载,不能改变参数等。
本文介绍了C++中的静态联编与动态联编概念,解析了虚函数的工作原理及其实现机制,并讨论了使用虚函数的代价,包括对象大小增加、编译器创建虚函数表以及函数调用时的额外开销。
713

被折叠的 条评论
为什么被折叠?



