博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++对象模型——函数的效能(第四章)
阅读量:6216 次
发布时间:2019-06-21

本文共 1423 字,大约阅读时间需要 4 分钟。

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的调用操作.

转载地址:http://rtsja.baihongyu.com/

你可能感兴趣的文章
Websharp.ORM 2.0实现原理[转]
查看>>
Core J2EE Patterns - Data Access Object
查看>>
操作无权限的MSMQ队列
查看>>
TPARAMS和OLEVARIANT相互转换
查看>>
ASP.NET AJAX(开发代号:Atlas)的相关问题请在本帖中提出
查看>>
Duplicate modifier for the method isExist in type UploadMusicInfoController
查看>>
学习Python的三种境界
查看>>
OGRE 3D游戏开发框架指南(Ogre创始人作序推荐,随书光盘含本书所有实例源代码)...
查看>>
Visual C++ 2010开发权威指南
查看>>
LightOJ 1277 Looking for a Subsequence(LIS)
查看>>
POJ 1568 Find the Winning Move(极大极小搜索)
查看>>
如何下载 破解文件
查看>>
git revert 和 git reset的区别
查看>>
环形缓冲区,魔戒lordrings,boost的circular_buffer
查看>>
热浪扭曲效果
查看>>
C# 线程手册 第一章 线程定义 中断和局部线程存储
查看>>
QT使用打印机
查看>>
电商大数据学习笔记:理论
查看>>
在Android应用中使用SQLite数据库(传智播客视频笔记)
查看>>
理解多线程设计模式
查看>>