Effective C++ Item 44 将与参数无关的代码抽离 templates

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie

经验:Templates 生成多个 classes 和多个函数,所以任何 template 代码都不该与某个造成膨胀的 template 参数产生相依关系

因非类型模板参数(non-type template parameters) 而造成的代码膨胀,往往可消除,做法是以函数参数或 class 成员变量替换 template 参数

示例:

template<typename T, std::size_t> //size_t 是非类型模板参数
class SquareMatrix{
public:
	//...
	void invert();
};
SquareMatrix<double, 5> sm1;
sm1.invert();
SquareMatrix<double, 10> sm2;
sm2.invert();

解析:具体化了两份 invert 。除了常量5和10外,其他部分完全相同

纠正:

template<typename T>
class SquareMatrixBase {
protected:
	void insert(std::size_t matrixSize);
};

template<typename T, std::size_t n> //?不太懂。这里不也用了非类型模板参数吗?
class SquareMatrix: private SquareMatrixBase<T>{
private:
	using SquareMatrixBase<T>::invert; //Item 33: 避免遮掩 base 版的 invert
public:
	void invert() {this->invert(n);} // Item 34: 使用 this,derived class 才会在模板基类里找名称
}

Effective C++ Item 44 将与参数无关的代码抽离 templates

时间: 2024-10-25 20:56:17

Effective C++ Item 44 将与参数无关的代码抽离 templates的相关文章

Effective C++ 条款44 将与参数无关的代码抽离template

1. template是节省时间和避免代码重复的有效方法,而且在将类模板(class template)具现化时,编译器只具现化那些被用到的成员函数,这更加节省了空间. 2. 正如两个函数存在代码重复时,倾向于把重复的代码抽出独立形成一个函数,然后让之前的函数调用这个函数,函数模板也可以这样,甚至类模板也可以采用相同的思想,例如,对于以下用于操作方矩阵的类模板: template<typename T,std::size_t n> //n是非类型参数 class SquareMatrix{ p

Item 44:将参数无关代码重构到模板外去

Item 44: Factor parameter-independent code out of templates. 模板是个好东西,你可以在实现类型安全的同时少写很多代码.但模板提供的是编译期的多态, 即使你的代码看起来非常简洁短小,生成的二进制文件也可能包含大量的冗余代码. 因为模板每次实例化都会生成一个完整的副本,所以其中与模板参数无关的部分会造成代码膨胀(code bloat). 把模板中参数无关的代码重构到模板外便可以有效地控制模板产生的代码膨胀. 另外代码膨胀也可以由类型模板参数

读书笔记 effective c++ Item 44 将与模板参数无关的代码抽离出来

1. 使用模板可能导致代码膨胀 使用模板是节省时间和避免代码重用的很好的方法.你不需要手动输入20个相同的类名,每个类有15个成员函数,相反,你只需要输入一个类模板,然后让编译器来为你实例化20个特定的类和300个你需要的函数.(只有在被使用的情况下类模版的成员函数才会被隐式的实例化,所以只有在300个函数被实际用到的情况下才会生成300个成员函数.)函数模板同样吸引人.你不用手动实现许多函数,你只需要实现一个函数模板,然后让编译器来做余下的事情. 然而在有些时候,如果你不小心,使用模板会导致代

Effective C++:条款44:将与参数无关的代码抽离template

(一) template是节省时间和避免重复代码的一个奇妙方法.class template的成员函数只有在被使用时才被暗中具现化.function templates有类似的诉求. 但是如果你不小心,使用templates可能导致代码膨胀(code bloat):其二进制代码带着重复(或几乎重复)的代码.数据.或两者.其结果可能源码看起来合身整齐,但目标码却不是那么回事.你需要知道如何避免这样的二进制浮夸. 主要工具是:共性与变性分析. 在non-template中,重复十分明确,然而在tem

Effective C++ Item 44 将与參数无关的代码抽离 templates

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:Templates 生成多个 classes 和多个函数,所以不论什么 template 代码都不该与某个造成膨胀的 template 參数产生相依关系 因非类型模板參数(non-type template parameters) 而造成的代码膨胀,往往可消除,做法是以函数參数或 class 成员变量替换 template 參数 演示样例: template<typename T,

Effective C++ Item 30 inline里里外外

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Item 44 46 1.将大多数 inlining 限制在小型.被频繁调用的函数身上.这可使日后的调试过程和二进制升级更容易, 也可使潜在的代码膨胀问题最小化,使程序的速度提升机会最大化. 2.inline是对编译器的一个申请. 隐喻方式:将函数定义于 class 定义式内, 如成员函数或 friend 函数 明确声明:在定义式前加关键字 inline 编译器会拒绝大过复杂的函数 inl

Effective C++ Item 3 尽可能使用const

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie const 出现在*左边指const data,出现在*右边指const pointer char greeting[] = "Hello"; char *p = greeting; //non-const pointer, non-const data const char *p = greeting; //non-const pointer, const data char

Effective C++ Item 29 为”异常安全”而努力是值得的

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:异常安全函数即使发生异常也不会泄漏资源或允许任何数据结构败坏.这样的函数区分为三种 可能的保证: 基本型-->发生异常,程序处于某个合法状态 强烈型-->发生异常,程序处于原先状态 不抛异常型-->承诺绝不抛出殿堂 示例: class PrettyMenu{ public: //... void changeBackground(std::istream &imgSr

读书笔记 effective c++ Item 55 让你自己熟悉Boost

你正在寻找一个高质量的,开源的,与平台和编译器无关的程序库的集合?看一下Boost吧.想加入一个由雄心勃勃的,充满天赋的正致力于最高水平的程序库设计和实现工作的C++程序员们组成的团体么?看一下Boost吧.想了解C++将来可能会是什么样子的?看一下Boost吧. Boost是一个C++开发人员组成的团体,也是供免费下载的C++程序库的集合.网址是http://boost.org. 1. Boost的两大优势 当然,有许多C++组织和网站,但是Boost有两点是其它组织不能与之媲美的.首先,它和