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. Dialog和FormView如何派生通用类

    派生通用类涉及到派生类的构造函数需要传递窗口ID和CWnd,所以要在派生类中事先定义好 在Dialog中构造函数是这样定义的 public: CDialogEx(); CDialogEx(UINT n ...

  2. Spring学习总结(9)——Spring AOP总结

    spring IOC和AOP是Spring框架的两大核心基石,本文将对Spring AOP做一个系统的总结. 什么是AOP AOP(Aspect-Oriented Programming,面向切面编程 ...

  3. 洛谷 P1724 东风谷早苗

    P1724 东风谷早苗 题目描述 在幻想乡,东风谷早苗是以高达控闻名的高中生宅巫女.某一天,早苗终于入手了最新款的钢达姆模型.作为最新的钢达姆,当然有了与以往不同的功能了,那就是它能够自动行走,厉害吧 ...

  4. Delphi部份函数,命令,属性中文说明

    Abort 函数 引起放弃的意外处理 Abs 函数 绝对值函数 AddExitProc 函数 将一过程添加到运行时库的结束过程表中 Addr 函数 返回指定对象的地址 AdjustLineBreaks ...

  5. 数据集 —— ground truth 数据集

    1. matlab 自带含 ground truth 数据集 %% 加载停车标志数据到内存: data = load('stopSignsAndCars.mat', 'stopSignsAndCars ...

  6. python序列中是否包含某个元素

    http://outofmemory.cn/code-snippet/9098/python-list-contains-with-in-not-in theList = ['a','b','c'] ...

  7. Nginx分发服务

    nginx配置分发tomcat服务 http://blog.csdn.net/yan_chou/article/details/53265775 http://www.cnblogs.com/deng ...

  8. git stash备份当前工作区内容,回到最近一次commit提交

    git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致.同时,将当前的工作区内容保存到Git栈中.git stash pop: 从Git栈中读取 ...

  9. 怎样判断一个P2P平台是否靠谱?

    判断一个网站,是否靠谱,是有规律可循的,P2P平台算是个新兴的电商类网站.   网上欺诈类的网站,不限于P2P,实在是太多了,真的有必要总结下最关键的几个靠谱指标.   最关键的2个   1.创始人和 ...

  10. C语言结构体的字节对齐原则

    为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据 ...