C++对象模型对象成员的效率 (Object Mem ber Efficiency)(第三章) .

3.5 对象成员的效率 (Object Mem ber Efficiency)

下面某个测试,目的在测试聚合(aggregation).封装(encapsulation),以及继承(Inheritance)所引发的额外负荷的程度.所有测试都是以个别局部变量的加法,减法,赋值(assign)等操作的存取成本为依据.下面就是个别的局部变量:

float pA_x = 1.725, pA_y = 0.875, pA_z = 0.478;

float pB_x = 0.315, pB_y = 0.317, pB_z = 0.838;

每一个表达式需执行一千万次,如下所示:

for (int iter = 0; iter < 10000000; iter++) {

pB_x = pA_x - pB_z;

pB_y = pA_y + pB_x;

pB_z = pA_z + pB_y;

}

首先针对三个 float 元素所组成的局部数组进行测试:

enum fussy{x, y, z};

for (int iter = 0; iter < 10000000; iter++) {

pB[x] = pA[x] - pB[z];

pB[y] = pA[x] + pB[x];

pB[z] = pA[z] + pB[y];

}

第二个测试是把同样的数组元素转换为一个C struct 数据抽象类型,其中的成员皆为 float,成员名称是x, y, z:

for (int iter = 0; iter < 10000000; iter++) {

pB.x = pA.x - pB.z;

pB.y = pA.y + pB.x;

pB.z = pA.z + pB.y;

}

更深一层的抽象化,是做出数据封装,并使用 inline 函数.坐标点现在以一个独立的Point3d class 来表示.尝试两种不同形式的存取函数,第一,定义一个 inline 函数,传回一个reference,允许它出现在assignment运算符的两端:

class Point3d {

public:

Point3d(float xx = 0.0, float yy = 0.0, float zz = 0.0)

: _x(xx), _y(yy), _z(zz) {}

float &x() { return _x; }

float &y() { return _y; }

float &z() { return _z; }

private:

float _x, _y, _z;

};

那么真正对每一个坐标元素的存取操作应该像这样:

for (int iter = 0; iter < 10000000; iter++) {

pB.x() = pA.x() - pB.z();

pB.y() = pA.y() + pB.x();

pB.z() = pA.z() + pB.y();

}

定义的第二种存取函数形式是,提供一对get/set函数:

float x() { return _x; }

void x(float xx) { _x = xx; }

于是对于每一个坐标值的存取操作应该像这样:

pB.x(pA.x() - pB.z());

下面给出上述各种测试的结果(优化开关打开后,"封装"就不会带来执行期的效率成本,不知道怎样打开优化开关...忘记了)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-15 07:36:36

C++对象模型对象成员的效率 (Object Mem ber Efficiency)(第三章) .的相关文章

C++对象模型——对象成员的效率 (Object Member Efficiency)(第三章)

3.5 对象成员的效率 (Object Mem ber Efficiency) 以下某个測试,目的在測试聚合(aggregation).封装(encapsulation),以及继承(Inheritance)所引发的额外负荷的程度.全部測试都是以个别局部变量的加法,减法,赋值(assign)等操作的存取成本为根据.以下就是个别的局部变量: float pA_x = 1.725, pA_y = 0.875, pA_z = 0.478; float pB_x = 0.315, pB_y = 0.317

读《深度探索C++对象模型》之对象成员的效率

测试平台:华硕N53S(五年前的老机子) 编译环境:VS2010 接下来我将会有多个测试,在多个不同环境下的所消耗的时间比较: 五个测试分别为:个别的局部变量.局部数组.struct之的Public.class 之中的inline Get函数. class之中的inline Get & Set函数: 代码片段如下: struct Point { Point(float mx, float my, float mz) { x = mx; y = my; z = mz; } float x, y,

《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个class object之中,就像C struct一样.而member functions虽然被包含在class的声明之内,但是不出现在Object之中.每一个non-inline function 只会产生一个函数实体.至于inline function则会在每一个调用使用的地方产生一个函数实体(在

类成员和对象成员

3.7   类数据成员和类成员函数 到目前为止,我们所看到的数据成员和成员函数都是属于对象的.比方说,我们在3.6节定义了Task类,如果我们用Task类定义如下两个对象: 那么,这两个对象都拥有各自的id.st.ft和logFile数据成员.C++还支持另外一种类型的成员,这种成员属于类本身,而不属于类的对象,我们称之为类成员(class member),而将属于对象的成员称为对象成员(object member)或实例成员(instance member).使用关键字static就可以创建一

对象成员

--------------siwuxie095 对象成员 在对象中包含其它对象是一种非常普遍的现象 以坐标系中的线段为例:说明对象成员的定义和使用方法 如果要定义一个如上图所示的线段类,每条线段都由两个点连接而形成, 这意味着,需要定义一个表示点的类,该点类包含横坐标和纵坐标,而 线段类包含两个坐标对象 可见,要描述清楚这个数学问题,至少要定义两个类:一个定义坐标的 点,另一个定义点上的线段 坐标类:Coordinate 线段类:Line 定义完成后,通过实例化来描述一条线段: 当实例化 Li

被遗忘的设计模式——空对象模式(Null Object Pattern)

GoF(四人帮)那本<设计模式 可复用面向对象软件的基础>可谓是设计模式方面的经典之作,其中介绍的23种设计模式, 也可谓是经典中的经典.但是,设计模式的种类绝不仅仅是这23种,除此之外还有很多巧妙可爱的设计模式值得我们学习.这些 被遗忘的设计模式,也可以堪称经典之作.今天我们来一起学习被遗忘的设计模式--空对象模式(Null Object Pattern). 一起看看这个模式会带给我们怎样的惊喜? 一.Pattern name Provide an object as a surrogate

贫血模型;DTO:数据传输对象(Data Transfer Object);AutoMapper ;Domain Model(领域模型);DDD(领域驱动设计)

====================== 我自己的理解 ========================== 一:  DTO  我自己的理解,就是 比如你有一个类,跟数据库的table表结构一模一样,主键外键什么的都有,但是这个 model类,你返回数据到 UI层的时候,有些数据是不用的,你就得自己new一个新类出来,新的类从旧的类里面拿值,然后给别人用的就是新的类别,有点类似于我们做接口给android手机用一样的,数据库的类和接口用的类,很相似,但是东西少了的很多,这个新的类(缺胳膊断腿

MFC 调用默认对话框类对象成员和方法

这个功能其实并不常用,然而在多线程和回调函数中要调用默认对话框类的对象成员或方法还是可能要用到的,所以做下记录. 首先声明一个全局变量用以存储默认对话框类对象指针: LPVOID pParam;//对话框对象指针 在默认对话框类的初始化函数中给该指针进行赋值: pParam = (void *)this; 在需要调用默认对话框类对象成员或方法处,通过如下代码实现调用: CPanoramicPlayerDlg *dlg = (CPanoramicPlayerDlg *)lpParam;//其中CP

警察和厨师为Polic类和Cook类增加了对象成员,请扩充代码

/* *Copyright (c) 2016,烟台大学计算机学院 *All rights reserved. *文件名称:main.cpp *作 者:郭辉 *完成时间:2016年5月10日 *版 本 号:v1.0 * *问题描述:项目-警察和厨师为Polic类和Cook类增加了对象成员,请扩充代码. *输入描述:无. *程序输出:信息. */ #include<iostream> #include <string> using namespace std; class Person