虚拟继承内存布局图示
2012-10-11 15:54
399 查看
在同时使用了虚函数的时候,虚基类表可以合并到虚表(virtual table)中,每对象的虚基类表指针(vbptr)也可以省略(只需vptr即可)。
虚函数是C++众多运行时多态特性中开销最小,也最常用的机制。虚函数的好处和作用这里不再多说,应当注意在对性能有苛刻要求的场合,或者需要频繁调用,对性能影响较大的地方(比如每秒钟要调用成千上万次,而自身内容又很简单的事件处理函数)要慎用虚函数。
需要特别说明的一点是:虚函数的调用开销与通过函数指针的间接函数调用(例如:经典C程序中常见的,通过指向结构中的一个函数指针成员调用;以及调用 DLL/SO中的函数等常见情况)是相当的。比起函数调用本身的开销(保存现场->传递参数->传递返回值->恢复现场)来说,一次指针间接引用是微不足道的。这就使得在绝大部分可以使用函数的场合中都能够负担得起虚方法的些微额外开销。
作为一种支持多继承的面向对象语言,虚基类有时是保证类层次结构正确一致的一种必不可少的手段。但在需要频繁使用基类提供的服务,又对性能要求较高的场合,应该尽量避免使用它。在基类中没有数据成员的场合,也可以解除使用虚基类。例如,在上图中,如果类 "BB" 中不存在数据成员,那么 "BB" 就可以作为一个普通基类分别被 "B1" 和 "B2" 继承。这样的优化在达到相同效果的前提下,解除了虚基类引起的开销。不过这种优化也会带来一些问题:从
"DD" 向上强制到 "BB" 时会引起歧义,破坏了类层次结构的逻辑关系。
相关文章推荐
- 虚拟继承内存布局图示
- 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局
- 虚拟继承与虚函数继承的内存布局
- 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局
- 多重继承和虚拟继承的内存布局
- 虚拟继承、多态的内存布局
- C++对象内存布局--⑩GCC编译器--虚拟继承--菱形继承
- 从汇编看c++的虚拟继承以及其内存布局(一)
- C++对象内存布局--⑦VS编译器--虚拟继承多个基类
- 类对象内存布局,虚函数,虚拟继承和多重继承的实现
- 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局 - 问笑
- 从汇编看c++中的虚拟继承及内存布局(二)
- C++对象内存布局--⑧GCC编译器--虚拟继承多个基类
- 【C++】菱形虚拟继承(内存布局)
- C++对象内存布局--⑨VS编译器--虚拟继承--菱形继承
- C++ 多重继承和虚拟继承的内存布局(vtable,vptr)
- C++对象内存布局--⑩GCC编译器--虚拟继承--菱形继承
- C++ 对象的内存布局(多重虚拟继承)
- 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局
- zz:c++类继承内存布局