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, 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)(第三章)的更多相关文章
- 深度探索C++对象模型之第三章:数据语义学
如下三个类: class X { }: class Y :public virtual X { }; class Z : public virtual X {}; class A :public Y, ...
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个c ...
- PowerShell 管道和对象成员
2.1 管道 在各种现代的shell中,均支持管道的概念. 管道的最大特点就是: 前一个命令的输出作为后一个命令的输入.cmd.bash均支持管道的概念,这里我就不多说了,下面我们说说PS中 管道 ...
- Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别
Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别 在工作中遇到一个问题,就是你需要去判断某个字符串是不是对象的某个成员属性名,然后根据判断结果 ...
- 对象池模式(Object Pool Pattern)
本文节选自<设计模式就该这样学> 1 对象池模式的定义 对象池模式(Object Pool Pattern),是创建型设计模式的一种,将对象预先创建并初始化后放入对象池中,对象提供者就能利 ...
- Java对象的序列化(Object Serialization)
先定义两个简单的类: package comm; import java.io.Serializable; import java.util.Date; import java.util.Gregor ...
- C++,对象成员的访问
成员变量和成员函数的访问可以采用以下几种访问方式:对象.成员变量名: 对象.成员函数名(实参列表)对象的指针->成员变量名; 对象的指针->成员函数名(实参列表)对象的引用.成员变量名对象 ...
- C++中的常对象和常对象成员
常对象 常对象必须在定义对象时就指定对象为常对象. 常对象中的数据成员为常变量且必须要有初始值,如 Time const t1(12,34,36); //定义t1为常对象 这样的话,在所有的场合中,对 ...
- 设计模式:空对象模式(Null Object Pattern)
设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...
随机推荐
- MySQL各个版本的区别
文章出自:http://blog.sina.com.cn/s/blog_62b37bfe0101he5t.html 感谢作者的分享 MySQL 的官网下载地址:http://www.mysql. ...
- 洛谷——P1073 最优贸易 ([NOIP2009] )
https://www.luogu.org/problem/show?pid=1073 题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多 ...
- JAVA异常机制简述
1.类的继承结构 在JAVA所有的异常对象都是Throwable类的一个子类的实例 Exception包含两个分支,由于程序错误导致的异常属于RuntimeException,比如数组下标越界,空指针 ...
- 开源课程管理系统(CMS):Moodle
开源课程管理系统(CMS):Moodle 一.总结 1.php开发的cms,可借鉴参考用 二.Moodle(百度) Moodle(Modular Object-Oriented Dynamic Lea ...
- transform属性实现翻转效果
transform:perspective(800px) rotateY(180deg);//翻转180度,透视800px; transition-delay: 0.3s;//过程时间 opacity ...
- bootstrap tab页
---恢复内容开始--- <!DOCTYPE html> <html> <head> <title>Bootstrap 实例</title> ...
- CodeVs——T 3305 水果姐逛水果街Ⅱ
http://codevs.cn/problem/3305/ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 De ...
- Varnish 实战
Varnish 实战项目 目录 实现基于Keepalived+Haproxy+Varnish+LNMP企业级架构 一.环境准备 1.1 相关配置 1.2 安装服务 1.3 关闭防火墙及selinu ...
- LeetCode Algorithm 03_Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters. For example, ...
- APP功能点测试
一.移动互联网特点: 1,用户体验至上:精准的用户体验 2,核心竞争力:市场占有率和业务创新能力 3,营销模型:通过口碑传播吸引客户,随之参与互动(如分享等,对接口测试要求高) 二.项目特点: 1,开 ...