c++动态绑定的解析及虚函数带来的开销

来源:互联网 发布:java表白代码结果演示 编辑:程序博客网 时间:2024/06/18 12:19
 每个支持虚函数的类(基类或派生类)都会有一个其所有支持的虚拟函数指针的虚拟函数表,每个该类生成的对象都会隐含一个虚拟函数指针,此指针指向其所属类的虚函数表,当通过基类的指针或引用调用每个虚拟函数时,系统首先定位这个指针或引用真正对应的对象所隐含的虚函数指针,然后虚函数指针会根据这个虚拟函数的名称,对这个虚拟函数指针指向的虚拟函数表进行一个偏移定位,再调用这个偏移定位处的函数指针对应的虚拟函数,这就是动态绑定整个运行过程

虚拟函数的开销
空间开销
1.每个支持虚拟函数的类,都有一个虚函数表,虚函数表的大小和该类拥有的虚拟函数个数多少成正比,此虚拟函数表对一个类来说,而无论该类生成多少对象运行是会生成多少个
,整个程序只有一个
2.支持虚拟函数的类在每生成一个对象时都会有一个指向该类对应虚拟函数表的虚拟函数指针,无论虚拟函数有多少,都会只有一个虚拟函数指针,因为与对象绑定,因此程序运行时虚拟函数指针引起的空间开销跟生成的对象个数成正比

时间开销
1. 支持虚拟函数的类生成的每个对象,当其生成时在构造函数中会调用编译器在构造函数内部插入的初始化代码,来初始化其虚拟函数指针,使其指向正确的虚拟函数表
2.通过指针或引用调用虚拟函数时,跟普通函数调用相比,会多一个根据虚拟函数指针主找到虚拟函数表的操作

如果想利用虚拟函数动态绑定带来的优势必须放弃内联函数带来的速度优势
原因:内联函数是在编译期间编译器将调用内联函数的地方使用其内联函数体的代码代替 ,虚拟函数本质上是运行期的行为,在编译期无法知道某处的虚拟函数在真正执行的时候会调用到那个具体的实现
0 0