码迷,mamicode.com
首页 > 编程语言 > 详细

C++对象模型——函数的效能(第四章)

时间:2015-08-11 18:43:10      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

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++对象模型——函数的效能(第四章)

标签:

原文地址:http://blog.csdn.net/yiranant/article/details/47424181

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!