effective c++ 笔记 (30-31)
2015-04-17 14:37
239 查看
//---------------------------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:记得一点:
头文件应该以“完全且仅有声明式”的形式存在。
*/
}
//#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 c++ 笔记 (31-34)
- effective c++ 笔记 (31-34)
- Effective C++ (E3 31)笔记之降低文件间编译依赖
- Effective C++ 笔记 条款31
- 《Effective C++》笔记:开篇
- Effective C++ 读书笔记1
- effective c++ 笔记
- js学习笔记30----对象
- Effective C++学习笔记之第四章(1)
- Python3萌新入门笔记(30)
- Effective STL学习笔记-条款31
- ArcGIS API for JavaScript 4.2学习笔记[31] (补充学习)Task类
- Effective C++ 笔记(一)
- iOS学习笔记30—检测硬件平台版本号
- IOS学习笔记 ---- 15/08/30之前
- Java学习笔记(31)-----------静态类
- Effective C++ 笔记
- Java基础知识强化之集合框架笔记31:集合之泛型类的概述和基本使用
- effective C++ 条款 30:透彻了解inlining的里里外外