C++对象模型——函数的效能(第四章)
2023-09-11 14:15:00 时间
4.3 函数的效能
在以下的这组測试中,在不同的编译器上计算两个3D点,当中用到一个nonmember friend function,一个member function,以及一个 virtual member function,而且 virtual member function分别在单一,虚拟,多重继承三种情况下运行.以下就是nonmember function:void cross_product(const Point2d &pA, const Point3d &pB) { Point3d pC; pC.x = pA.y * pB.z - pA.z * pB.y; pC.y = pA.z * pB.x - pA.x * pB.z; pC.z = pA.x * pB.y - pA.y * pB.x; }main()函数看起来像这样(调用的是nonmember function):
main() { Point3d pA(1.725, 0.875, 0.478); Point3d pB(0.315, 0.317, 0.838); for (i = 0; i < 10000000; i++) { pA.cross_product(pA, pB); } return 0; }假设调用不同形式的函数,測试出的结果也是不同的.
在单一继承时情况下运行这项測试时,每多一层继承,virtual function的运行时间就有明显的添加.原因是:无论单一继承的深度怎样,主循环中用以调用函数的码其实是全然同样的;同样的道理,对于坐标值的处理也是全然同样的,其间的不同,就是cross_product()中出现的局部性Point3d class object pC.于是default Point3d constructor被调用了一千万次.添加继承深度,就多添加运行成本,这一事实反映出pC身上的constructor的复杂度.这也可以解释为什么多重继承的调用另有一些额外负担.
导入 virtual function后,class constructor将获得參数以设定 virtual table指针.每多一层继承,就会多添加一个额外的vptr设定.此外,以下这个測试操作会插入到constructor中,以回溯兼容C++2.0:
// 在每个base和derived class constructor中被调用 if (this || this = new(sizeof(*this)) // user code goes here在导入 new 和 delete 运算符之前,承担 class 内存管理的唯一方法就是在constructor中指定 this 指针.
在这些编译器中,每个额外的base class 或额外的单一继承层次,其constructor内会被增加还有一个对 this 指针的測试.若运行这些constructor一千万次,效率就会因此下降至能够測试的程度.
局部性的pC class object即使未被使用,它还是须要一个constructor--可是能够经由消除对局部对象的使用,而消除其constructor的调用操作.
相关文章
- 经典中的品味:第二章 C++基本的对象,类型和值(上)
- 旅行,说走就走 Help? [C++数据类型和表达式]
- C++设计模式6--原型模式Prototype--原始对象的克隆
- C++设计模式12--建造者模式----创建复杂对象的工程师
- C/C++基础讲解(七十二)之常见试题解答篇(统计符合特定条件的数/字符串倒置)
- Open3D (C++)FPS最远点下采样
- paip.最新的c++ qt5.1.1环境搭建跟hello world
- 技术解析丨C++元编程之Parser Combinator
- C++中cin对象关于错误的处理
- c++ vector 初始化_C++--vector()的用法
- C++判断两个指针指向的对象是否相同
- 图说C++对象模型:对象内存布局详解 强烈推荐
- C++小思
- c++ vector C++ vector存放结构体 并且排序
- C++继承时的对象内存位置(一)有成员变量遮蔽时的内存分布
- c++ 对象
- C++程序运行过程中发生异常闪退,很有可能是这三个原因导致的
- C++,STL -- 函数对象、常用算法
- 学习C++:C++进阶(三)CMake基础篇---用cmake配置静态库、共享库、仅有头文件的库、对象库并使用这些库
- C++使用技巧(二十四):回顾vector用法及多维数组使用