effective c++ 笔记 (30-31)
//---------------------------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)的更多相关文章
- [Effective JavaScript 笔记]第31条:使用Object.getPrototypeOf函数而不要使用__proto__属性
ES5引入Object.getPrototypeOf函数作为获取对象原型的标准API,但由于之前的很多js引擎使用了一个特殊的__proto__属性来达到相同的目的.但有些浏览器并不支持这个__pro ...
- [Effective JavaScript 笔记]第3章:使用函数--个人总结
前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象
js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...
- [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符
“1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...
- [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码
函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...
- [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法
js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...
- java effective 读书笔记
java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 si ...
- Effective STL 笔记 -- Item 6 ~ 7: Container and Object Pointer
Effective STL 笔记 – Item 6 ~ 7: Container and Object Pointer 中间两次笔记被删掉了,简单补一下: Item 3 中提到如果将对象直接放入容器中 ...
- Item 5:那些被C++默默地声明和调用的函数 Effective C++笔记
Item 5: Know what functions C++ silently writes and calls 在C++中,编译器会自己主动生成一些你没有显式定义的函数,它们包含:构造函数.析构函 ...
随机推荐
- sql server对并发的处理-乐观锁和悲观锁(转)
假如两个线程同时修改数据库同一条记录,就会导致后一条记录覆盖前一条,从而引发一些问题. 例如: 一个售票系统有一个余票数,客户端每调用一次出票方法,余票数就减一. 情景: 总共300张票,假设两个售票 ...
- c#WebApi使用form表单提交excel,实现批量写入数据库
思路:用户点击下载模板按钮,获取到excel模板,然后向里面填写数据保存.from表单提交的时候选择保存好的excel,实现数据的批量导入过程 先把模板放在服务器的项目目录下面:如 模板我一般放在:F ...
- 转:ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发
说说传统做法的缺点 1.做过多语言的都知道这玩意儿太花时间 2.多语言架构一般使用资源文件.XML或者存储数据库来实现.这样就在一定程序上降低了性能 3.页面的可读性变差,需要和资源文件进行来回切换 ...
- 转:前端js、jQuery实现日期格式化、字符串格式化
1. js仿后台的字符串的StringFormat方法 在做前端页面时候,经常会对字符串进行拼接处理,但是直接使用字符串拼接,不但影响阅读,而且影响执行效率,且jQuery有没有定义字符串的Strin ...
- python基础学习14----正则表达式
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 在python中正则表达式被封 ...
- RecyclerView嵌套TextView时显示文字不全的解决方法之一
先描述一下这个小bug:简单的TextView嵌套RecyclerView作为itemView时,可能会在文本中出现布局覆盖的现象,itemView的布局其实很简单,就是一个RelativeLayou ...
- win7X64位安装mysql-5.7.16
今天尝试在win7系统中安装mysql,发现过程有点复杂,不过还好已经成功安装,写个博客纪念一下,顺便可以帮助大家. 1.在官网上面下载mysql, 注意:一定要下载对应的版本,第一次下载的是最下面一 ...
- TruncateATable 清除一张表
当我们想删除一张表的全部数据时,我们可以使用 truncate 关键字,但如果要删除的表的主键被引用了,那么就无法执行语句. 1.制作清除数据的工具 ,在 nuget 控制台中输入 Install-P ...
- 题解 P2920 【[USACO08NOV]时间管理Time Management】
题面 作为一名忙碌的商人,约翰知道必须高效地安排他的时间.他有N工作要 做,比如给奶牛挤奶,清洗牛棚,修理栅栏之类的. 为了高效,列出了所有工作的清单.第i分工作需要T_i单位的时间来完成,而 且必须 ...
- PAT 1025 反转链表
PAT (Basic Level) Practise 1025 Github链接:https://github.com/H-BING/object-oriented/tree/master/PAT10 ...