//---------------------------15/04/17----------------------------

//#30   透彻了解inlineing的里里外外

{

/*

1:inline函数通常可以免除函数调用的成本,而且编译器会对它执行语境相关最优化。

2:使用inline函数很有可能增加你的目标码的大小。因为对每个函数的调用都使用函数本体来替换,如果函数

本体很大的话代码膨胀是肯定的。但是如果inline函数的本体很小,那么将产生出小的码。

3:inline只是对编译器的一个申请,不是命令。

4:定义在class定义式内的成员函数默认使用inline。

5:inline函数通常一定被置于头文件,因为一般情况下,编译器在编译期间必须要知道函数本体才能替换成功。

6:编译器拒绝一些复杂的inline函数,比如递归(书上说循环也不行,但是记得看到过很多人都说循环是可以inline

的),编译器拒绝virtual函数,因为这些函数到了运行期才确定调用哪一个函数。

7:编译器不对“通过函数指针而进行的调用”实施inlining。

8:不要对构造和析构函数指定inline。

9:inline函数使得用到这个函数的程序,在函数改动后必须重新编译。

10:总结:一开始别使用inline,当遇到造成效率影响的20%的代码时,可以找机会将它inline。

*/

}

//#31   将文件间的编译依存关系将至最低

{

/*

1:考虑三个设计策略:

1>如果使用object references或 object pointers可以完成任务,就不要使用objects。

如果只需要point或references,编译器就不需要知道object的大小,也就不需要知道它的

具体定义,当使用这个object pointer时,可以包含一个声明式就好。

2>如果可能,尽量以class声明式替换class定义式。

这样除非到了真正调用时,就可以不管class的定义。也就去除了编译依存。

3>为声明式和定义式提供不同的头文件。

为了实现上面的准则,提供声明式的头文件,就可以让客户选择只包含声明。

2:实现声明和实现分离的办法有两个:

1>在类中包含一个需要具体操作的指针对象,在需要功能的时候通过指针对象的功能:         */

#include "PersonImpl.h"

#include "People.h"

Person::Person(const std::string& name,const Date& birthday,
const Address& addr)

: pImpl(new PersonImpl(name, birthday, addr)){}

std::string Person::name()const

{

return pImpl->name();

}

/*      其实这就是设计模式中桥接模式的思想。分离接口与实现的技术。

2>通过接口一个接口类,这个类没有成员变量,只有一个virtual析构函数和一组pure virtual。

客户可以使用这个接口类,必须只能使用这个类的指针,因为内含pure virtual函数的class是

无法实例化的。然后使用一个工厂类来获得具体对象。

其实这就是设计模式中的工厂方法模式。

3:记得一点:

头文件应该以“完全且仅有声明式”的形式存在。

*/

}

effective c++ 笔记 (30-31)的更多相关文章

  1. [Effective JavaScript 笔记]第31条:使用Object.getPrototypeOf函数而不要使用__proto__属性

    ES5引入Object.getPrototypeOf函数作为获取对象原型的标准API,但由于之前的很多js引擎使用了一个特殊的__proto__属性来达到相同的目的.但有些浏览器并不支持这个__pro ...

  2. [Effective JavaScript 笔记]第3章:使用函数--个人总结

    前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...

  3. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  4. [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

    js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...

  5. [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

    “1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...

  6. [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

    函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...

  7. [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

    js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...

  8. java effective 读书笔记

    java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 si ...

  9. Effective STL 笔记 -- Item 6 ~ 7: Container and Object Pointer

    Effective STL 笔记 – Item 6 ~ 7: Container and Object Pointer 中间两次笔记被删掉了,简单补一下: Item 3 中提到如果将对象直接放入容器中 ...

  10. Item 5:那些被C++默默地声明和调用的函数 Effective C++笔记

    Item 5: Know what functions C++ silently writes and calls 在C++中,编译器会自己主动生成一些你没有显式定义的函数,它们包含:构造函数.析构函 ...

随机推荐

  1. IE中操作粘贴板复制和粘贴

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. MySQL 8.0新特性之原子DDL

    文章来源:爱可生云数据库 简介 MySQL8.0 开始支持原⼦ DDL(atomic DDL),数据字典的更新,存储引擎操作,写⼆进制日志结合成了一个事务.在没有原⼦DDL之前,DROP TABLE ...

  3. .NET实现自动编译

    前言 因每次发布版本的时候,都需要打开vs项目,然后进行编译.如果刚好手里有文件在修改,就需要先签入之类的.所以想找个可以实现自动编译的工具. 在网上查询了不少资料,终于基本上实现了自动编译的功能.因 ...

  4. UNIX高级环境编程(11)进程控制(Process Control)- 进程快照,用户标识符,进程调度

    1 进程快照(Process Accounting) 当一个进程终止时,内核会为该进程保存一些数据,包括命令的小部分二进制数据.CPU time.启动时间.用户Id和组Id.这样的过程称为proces ...

  5. tail 尾巴

    tail用法:尾巴,取文件的最后N行,默认前10行, -n 2 取前2行-n 2,简写就是-2 -f 文件 跟踪一个文件尾部的时时变化. 克隆出一个窗口执行:循环脚本:for n in `seq 1 ...

  6. django -- Celery实现异步任务

    1. 环境 python==2.7 djang==1.11.2 # 1.8, 1.9, 1.10应该都没问题 celery-with-redis==3.0 # 需要用到redis作为中间人服务(Bro ...

  7. 1083. [SCOI2005]繁忙的都市【最小生成树】

    Description 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道 路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路 ...

  8. [USACO2004OPEN]Cave Cows 3

    嘟嘟嘟 看完题后突然想起jf巨佬的话:"看到曼哈顿距离就想转切比雪夫距离." 于是我就转换了一下. 然后问题变成了求 \[max_{i, j \in n} \{ max \{ |x ...

  9. POJ3801 Crazy Circuits

    嘟嘟嘟 上下界网络流之最小流. 建图不说啦,裸的. 在有附加源\(S\)和附加汇\(T\)的图上跑完后,删除和\(S, T\)相连的边.然后因为可能流多了,所以现在应该退流,于是我们从\(t\)到\( ...

  10. MyBatis实战之映射器

    映射器是MyBatis最强大的工具,也是我们使用MyBatis时用得最多的工具,因此熟练掌握它十分必要.MyBatis是针对映射器构造的SQL构建的轻量级框架,并且通过配置生成对应的JavaBean返 ...