读书笔记MoreEffectiveC++(24)
2015-07-28 11:05
204 查看
理解虚拟函数、多继承、虚基类和RTTI 所需的代价
1.一个vtbl 通常是一个函数指针数组。(一些编译器使用链表来代替数组,但是基本方法是一样的)在程序中的每个类只要声明了虚函数或继承了虚函数,它就有自己的vtbl,并且类中vtbl 的项目是指向虚函数实现体的指针。
2.派生类会继承基类的虚函数
3.你必须为每个包含虚函数的类的virtualtalbe 留出空间。类的vtbl 的大小与类中声明的虚函数的数量成正比(包括从基类继承的虚函数)。每个类应该只有一个virtual table.
4.调用虚函数所需的代价基本上与通过函数指针调用函数一样。虚函数本身通常不是性能的瓶颈。
5.实际上虚函数不能是内联的。这是因为“内联”是指“在编译期间用被调用的函数体本身来代替函数调用的指令”但是虚函数的“虚”是指“直到运行时才能知道要调用的是哪一个函数。
6.到虚函数能使对象变得更大,而且不能使用内联,我们已经测试过多继承和虚基类也会增加对象的大小。
7.RTTI 能让我们在运行时找到对象和类的有关信息,所以肯定有某个地方存储了这些信息让我们查询。这些信息被存储在类型为type_info 的对象里,你能通过使用typeid 操作符访问一个类的type_info 对象。
8.RTTI 数据似乎有些象virtual function talbe(虚函数表)。每个类我们只需要信息的一个拷贝,我们需要一种方法从任何包含虚函数的对象里获得合适的信息。这种RTTI 和virtual function table 之间的相似点并不是巧合:RTTI被设计为在类的vtbl 基础上实现。
1.一个vtbl 通常是一个函数指针数组。(一些编译器使用链表来代替数组,但是基本方法是一样的)在程序中的每个类只要声明了虚函数或继承了虚函数,它就有自己的vtbl,并且类中vtbl 的项目是指向虚函数实现体的指针。
2.派生类会继承基类的虚函数
3.你必须为每个包含虚函数的类的virtualtalbe 留出空间。类的vtbl 的大小与类中声明的虚函数的数量成正比(包括从基类继承的虚函数)。每个类应该只有一个virtual table.
4.调用虚函数所需的代价基本上与通过函数指针调用函数一样。虚函数本身通常不是性能的瓶颈。
5.实际上虚函数不能是内联的。这是因为“内联”是指“在编译期间用被调用的函数体本身来代替函数调用的指令”但是虚函数的“虚”是指“直到运行时才能知道要调用的是哪一个函数。
6.到虚函数能使对象变得更大,而且不能使用内联,我们已经测试过多继承和虚基类也会增加对象的大小。
7.RTTI 能让我们在运行时找到对象和类的有关信息,所以肯定有某个地方存储了这些信息让我们查询。这些信息被存储在类型为type_info 的对象里,你能通过使用typeid 操作符访问一个类的type_info 对象。
8.RTTI 数据似乎有些象virtual function talbe(虚函数表)。每个类我们只需要信息的一个拷贝,我们需要一种方法从任何包含虚函数的对象里获得合适的信息。这种RTTI 和virtual function table 之间的相似点并不是巧合:RTTI被设计为在类的vtbl 基础上实现。
相关文章推荐
- 谭浩强《C++程序设计》学习篇———虚函数
- C++易vector
- c++中sort()及qsort()的用法总结
- C++中智能指针的设计和使用
- EGE图形配置(DEV C++5.6.0 MinGW4.8.1)
- integer to roman leetcode c++实现
- 『c++』 模板(template)--- 参数化多态性
- 一个C++版的嵌入式操作系统
- C++ typedef用法小结 (※不能不看※)
- 读书笔记MoreEffectiveC++(23)
- C语言逻辑运算符中真假的概念
- 安卓能用的modebus CRC16计算,附上对应的C语言的CRC16(转)
- 读书笔记MoreEffectiveC++(22)
- 笔试题汇集之常见算法篇(C/C++)
- 笔试题汇集之大数处理篇(C/C++)
- 一个箱子的推箱子算法
- 张正友相机标定算法原理与源代码(OpenCV+C++)
- 读书笔记MoreEffectiveC++(21)
- (C++)已知String类的定义,实现其函数体
- C/C++__函数指针