MoreEffectiveC++Item35(效率)(条款16-24)

条款16 谨记80-20法则

80-20 准则说的是大约 20%的代码使用了 80%的程序资源;大约 20%的代码耗用了大约 80%的运行时间;大约 20%的代码使用了 80%的内存;大约 20%的代码执行 80%的磁盘访问;80%的维护投入于大约 20%的代码上;通过无数台机器、操作系统和应用程序上的实验这条准则已经被再三地验证过。80-20 准则不只是一条好记的惯用语,它更是一条有关系统性能的指导方针,它有着广泛的适用性和坚实的实验基础



条款17 考虑使用 lazy evaluation(缓释评估)

从效率上来看,最好的运算就是未被执行过的运算,但是这是不可能的,既然不用我们就没有必要将它加到程序中.

那么下面介绍一种战术"lazy evaluation(缓释评估)",所谓的缓释平时评估就是拖延战术,如果你采用缓式评估来编写你的类,使他们延缓运算,直到哪些运算结果刻不容缓地被迫切需要为止.如果其运算结果一直不被需要,也就一直不执行.

那么我们先介绍一种缓式评估

1.Reference Counting(引用计数)

考虑下面的代码

class String { ... }; // 一个字符串类(标准的string类型,为了描述下面的技术实现,不过并非一定如此)
String s1 = "Hello";
String s2 = s1; //调用 string 拷贝构造函数

一旦s2 = s1,那么其拷贝构造函数就会被调用,那么我们就存在两个"Hello"的副本(eager evaluation急式评估),调用new operator 来为s2分配内存

这时我们考虑一下,如果s2只做一些类似于读的操作(例如下面的代码),那么我么就没有必要去新new出一个String,我们只需要将s1和s2共享即可

cout << s1; // 读 s1 的值
cout << s1 + s2; // 读 s1 和 s2 的值

但是如果我们即要读又要写的话那么数据共享就行不通,比如说我只想修改s2那么我们就 必须要为s2创建一个"副本".为了处理这样的case,我们需要添加如下语句

s2.convertToUpperCase();

在这个方法实现中我们必须令String.converToUpperCase()函数为s2的内容做一个副本,并且在修改s2之前先让该副本成为s2的私有数据,在converToUpperCase()函数内我们不能再拖延了,我们必须将s2(被共享的内容做一个副本,给s2私人使用).另一方面如果s2从未被改变,如果我们够幸运,s2从未被改过,那么我们就始终不用去new它.(相应实现我们会在条款29中详细叙述)

2.Lazy Fetching(缓式取出)

时间: 2024-10-29 19:08:12

MoreEffectiveC++Item35(效率)(条款16-24)的相关文章

MoreEffectiveC++Item35(操作符)(条款5-8)

条款5 对定制的"类型转换函数"保持警惕 条款6 区别increment/decrement操作符的前值和后置形式 条款7 千万不要重载&&,||,和,操作符 条款8 了解不同意义的 new 和 delete

Effective C++:条款16:成对使用new和delete时要采取相同形式

(一) 先看下面的代码: string* stringArray = new std::string[100]; ... delete stringArray; 这样的做法是错误的,因为stringArray所含的100个string对象中的99个可能并没有被适当地删除,因为它们的析构函数很可能没有被调用. (二) 使用new时发生的事情: (1)内存被分配出来: (2)针对此内存会有一个或更多个构造函数被调用: 使用delete,也有两个动作: (1)针对此内存会有一个或更多个析构函数被调用:

编程之美-1.16 24点游戏

一.问题描述 给玩家4张牌,每张牌牌面值在1~13之间,允许其中有数值相同的牌.采用加.减.乘.除四则运算,允许中间运算存在小数,并且可以使用括号,但每张牌只能使用一次,尝试构造一种表达式,使其运算结果为24. 如 输入:3 3 7 7 输出:(((3)/(7))+(3))*(7) 二.程序实现原理 遍历所有可能的组合,直到找到一个符合条件的组合或者遍历所有情况没有找到满足的组合,具体详见代码注释 三.程序基本实现 #include<iostream> #include<string&g

effctive C++ 读书笔记 条款 16

条款16 成对使用new和delete时要采取相同形式 #include <iostream> #include <string> using namespace std; /* 条款16:成对使用new 和 delete时要采取相同形式 如果你在new表达式中使用[],必须在相应的delete表达式中也使用[],如果在new当中没有使用[],那么delete中也 不能使用[],两者是成对出现的. */ int main() { //第一版 : 报错 /* string * p_s

EC读书笔记系列之9:条款16、17

条款16 成对使用new和delete时要采取相同形式 记住: ★若你在new表达式中使用[ ],必须在相应的delete中也使用[ ],反之亦然 ------------------------------------------------------------------ 当结合typedef使用时,应特别注意:如: typedef std::string AddressLines[4]; std::string *pal = new AddressLines; //等同于new str

MoreEffectiveC++Item35 条款25 将constructor和non-member functions虚化

1.virtual constructor 在语法上是不可将构造函数声明成虚函数,虚函数用于实现"因类型而异的行为",也就是根据指针或引用所绑定对象的动态类型而调用不同实体.现在所涉及的 virtual-constructor实际上是"仿virtual-constructor. 假设你设计一个软件,用来处理新闻事件,它由文字和图形构成 class NLComponent { //用于 newsletter components public: // 的抽象基类 ... //包

提高工作效率的16条Android开发小经验

笔者在经历了多个Android开发项目之后,个人积累也从别处学习了很多在Android开发中非常实用的小经验.下面从中选择了最实用的16条,分享给大家. 1.TextView中的getTextSize返回值是以像素(px)为单位的,而setTextSize()是以sp为单位的.所以如果直接用返回的值来设置会出错,解决办法是用setTextSize()的另外一种形式,可以指定单位: 1 2 3 4 <span style="font-size:16px;">setTextSi

高通小尺寸电子价签显示方案 — 支持12/16/24点阵字库

电子货架标签系统是高通智能科技在零售业的成功商业化应用产品之一.其主要功能是替代传统纸质价格标签的电子显示装置,通过有线或者无线网络与商场计算机数据库相连,并将商超等零售业的商品价格通过电子货架标签上的屏显示出来.电子货架标签系统成功地将货架纳入了计算机程序,摆脱了手动更换价格标签的状况,实现了收银台与货架之间的价格一致性. 目前,高通电子货架标签基于硬件与软件的开发已完全成熟,并自主研发了电子价签字库,使显示更加专业.规范且效果丰富多样化: 一.212x104分辨率:12.16.24点阵字库:

提高SQL执行效率的16中方法

项目中优化sql语句执行效率的方法:1)尽量选择较小的列2)将where中用的比较频繁的字段建立索引3)select子句中避免使用‘*’4)避免在索引列上使用计算.not in 和<>等操作5)当只需要一行数据的时候使用limit 16)保证单表数据不超过200W,适时分割表.针对查询较慢的语句,可以使用explain 来分析该语句具体的执行情况. -------------------------------------------------------------------------