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());

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

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

  1. 深度探索C++对象模型之第三章:数据语义学

    如下三个类: class X { }: class Y :public virtual X { }; class Z : public virtual X {}; class A :public Y, ...

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

    转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个c ...

  3. PowerShell 管道和对象成员

    2.1  管道 在各种现代的shell中,均支持管道的概念. 管道的最大特点就是:  前一个命令的输出作为后一个命令的输入.cmd.bash均支持管道的概念,这里我就不多说了,下面我们说说PS中 管道 ...

  4. Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别

    Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别 ​ 在工作中遇到一个问题,就是你需要去判断某个字符串是不是对象的某个成员属性名,然后根据判断结果 ...

  5. 对象池模式(Object Pool Pattern)

    本文节选自<设计模式就该这样学> 1 对象池模式的定义 对象池模式(Object Pool Pattern),是创建型设计模式的一种,将对象预先创建并初始化后放入对象池中,对象提供者就能利 ...

  6. Java对象的序列化(Object Serialization)

    先定义两个简单的类: package comm; import java.io.Serializable; import java.util.Date; import java.util.Gregor ...

  7. C++,对象成员的访问

    成员变量和成员函数的访问可以采用以下几种访问方式:对象.成员变量名: 对象.成员函数名(实参列表)对象的指针->成员变量名; 对象的指针->成员函数名(实参列表)对象的引用.成员变量名对象 ...

  8. C++中的常对象和常对象成员

    常对象 常对象必须在定义对象时就指定对象为常对象. 常对象中的数据成员为常变量且必须要有初始值,如 Time const t1(12,34,36); //定义t1为常对象 这样的话,在所有的场合中,对 ...

  9. 设计模式:空对象模式(Null Object Pattern)

    设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...

随机推荐

  1. 对ng-repeat的表格内容添加不同样式:ng-style

    对ng-repeat的表格内容添加不同样式,html代码: <tr ng-repeat="x in tableData"> <td>{{x.networkN ...

  2. map按value查找相应元素

    find_if算法用来在map中查找value符合条件的pair元素,返回指向该符合条件元素的迭代器,如果找到,那么返回最后一个元素的后一个元素end(); 1.首先要定义头文件 #include & ...

  3. GO语言学习(十五)Go 语言指针

    Go 语言指针 Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务. 接下来让我们来一步步学习 Go 语言指针. 我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地 ...

  4. 忍者无敌-实例解说Cocos2d-x瓦片地图

    实例比較简单,如图所看到的,地图上有一个忍者精灵,玩家点击他周围的上.下.左.右,他能够向这个方向行走. 当他遇到障碍物后是无法穿越的,障碍物是除了草地以为部分,包含了:树.山.河流等. 忍者实例地图 ...

  5. WebService--CXF以及CXF与Spring的整合(jaxws:server形式配置)

    前言:好记性不如烂笔头,写博客的好处是,以前接触的东西即便忘记了,也可以从这里查找. Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来 ...

  6. 驱动学习2-Menuconfig与Kconfig

    Menuconfig: 执行make Menuconfig命令是为了产生.config文件 Kconfig: Kconfig中的指令可以改变Menuconfig图形界面中的东西,例如假如leds控制选 ...

  7. C# 数据通信

    json asmxwcfwebRequestwebClient 串口 socket

  8. ajax日期參数格式问题

    今天遇到ajax传输日期參数后台无法识别的问题,错误异常例如以下. 从异常中能够看出传输到后台的日期数据格式为Thu Aug 13 2015 19:45:20 GMT+0800 (中国标准时间),这样 ...

  9. UIDeviceOrientationDidChangeNotification和UIApplicationDidChangeStatusBarFrameNotification

    这几天做App的时候,需要添加旋转屏通知以便调整UI布局 刚开始我使用的是UIDeviceOrientationDidChangeNotification, 一直有一些问题就是,如果使用这个通知,当i ...

  10. 工欲善其事必先利其器--------搭建Android平台

    工欲善其事必先利其器--------搭建Android平台 1.1            安装JDK 在Eclipse的开发过程中需要JDK或JRE的支持,否则会报错. (1)     下载JDK(建 ...