Effective C++ 条款44
本节条款的标题是:将与參数无关的代码抽离templates
学习本节条款首先须要明确一件事情,那就是模板实例化的过程会不会反复?
我们来举个样例:
#include<iostream>
using namespace std;
template <typename T>
T Try(T m)
{
return m;
}
int main()
{
Try(10);
Try(1);
}
我们看以上简单的代码。每一个人都知道模板被调用了两次,是的,这显而易见。但是模板也被实例化了两次吗?其实,模板仅仅实例化了一次。
我们再举个样例:
#include<iostream>
using namespace std;
template <typename T>
T Try(T m)
{
return m;
}
int main()
{
Try(10);
Try(1.01);//注意!此时是一个double型
}
这个时候每一个人都知道模板被调用了两次。模板也被实例化了两次吗?其实,模板确实实例化了两次。
比較以上两个样例。大家明确了什么?那就是,模板函数的实例化次数和调用次数没有直接关系,而是和调用类型的种类有关。同种类型假设已经调用,模板函数会反复利用上次的实例化样例。而不会又一次分配内存实例化。假设,大家明确这一点本节条款就能理解了。
我们利用template就是为了让代码编写更简短。利用内存更小。但是,普通情况下非常多程序猿仅仅能做到第一步,而不能充分在内存中发挥代码的复用性。
例如以下书上样例:
template<typename T, std::size_t n>//T为数据类型,n为矩阵大小
class SquareMatrix{
public:
……
void invert();//求逆运算
};
SquareMatrix<double,5> sm1;
sm1.invert();//调用SquareMatrix<double,5>::invert
SquareMatrix<double,10> sm2;
sm2.invert();//调用SquareMatrix<double,10>::invert
上面的代码会在运行的过程中,详细化两份invert()函数。这两份函数差点儿全然同样,所以对于内存来说是种浪费。假设想要弥补这样的缺点,我们能够用下面对照样例:
template<typename T>
class SquareMatrixBase
{
public:
SquareMatrixBase(T* p) : DataPointer(p){}
void Invert(size_t n){}
private:
T* DataPointer;
};
template <typename T, size_t n>
class SquareMatrix: private SquareMatrixBase<T>
{
public:
SquareMatrix() : SquareMatrixBase(Data)
{}
void Invert()
{
SquareMatrixBase::Invert(n);
}
private:
T Data[n * n];
};
SquareMatrix<double,5> sm1;
sm1.invert();
SquareMatrix<double,10> sm2;
sm2.invert();
当我们再次调用以上语句时,SquareMatrixBase类的实例在内存中仅仅生成一次。由于每次调用都是double 型的SquareMatrixBase。
然后矩阵数据是用指针訪问,同一种数据不会被拷贝多份,这样也降低了内存利用。
总之。下面三条非常重要:
1. Template生成多个classes与多个函数。所以不论什么template代码都不该与某个造成膨胀的template參数产生相依关系。
2. 因非类型模板參数而造成的代码膨胀,往往能够消除,做法是以函数參数或者class成员变量替换template參数。
3. 因类型而造成的代码膨胀,也能够降低,做法是让带有全然同样二进制表述的具现类型共享实现码。
Effective C++ 条款44的更多相关文章
- Effective C++ -----条款44:将与参数无关的代码抽离templates
Templates生成多个classes和多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生相依关系. 因非类型模板参数(non-type template para ...
- [More Effective C++]条款22有关返回值优化的验证结果
(这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...
- More Effective C++ 条款0,1
More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ...
- Effective C++ 条款08:别让异常逃离析构函数
1.别让异常逃离析构函数的原因 <Effective C++>第三版中条款08建议不要在析构函数中抛出异常,原因是C++异常机制不能同时处理两个或两个以上的异常.多个异常同时存在的情况下, ...
- Effective C++ -----条款28:避免返回handles指向对象内部成分
避免返回handles(包括reference.指针.迭代器)指向对象内部.遵守这个条款可增加封装性,帮助const成员函数的行为像个const,并将发生“虚吊号码牌”(dangling handle ...
- Effective C++ -----条款21:必须返回对象时,别妄想返回其reference
绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个loc ...
- Effective C++ -----条款19:设计class犹如设计type
Class的设计就是type的设计.在定义一个新type之前,请确定你已经考虑过本条款覆盖的所有讨论主题. 新type的对象应该如何被创建和销毁? 对象的初始化和对象的赋值该有什么样的区别? 新typ ...
- Effective C++ -----条款18:让接口容易被正确使用,不易被误用
好的接口很容易被正确使用,不容易被误用.你应该在你IDE所有接口中努力达成这些性质. “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容. “阻止误用"的办法包括建立新类型.限 ...
- Effective C++:条款27——条款
条款27:尽量少做转型动作 单一对象可能拥有一个以上的地址!
随机推荐
- 【C语言疯狂讲义】(八)C语言一维数组
1.数组的基本概念: 同样类型 若干个 有序 由若干个同样类型的数据组成的有序的集合 有序:存储地址连续 下标连续 数组名:用来存放数组首地址的变量 数组元素:构成数组的每个数据 数组的 ...
- cocos2d-x-3.1 事件分发机制 (coco2d-x 学习笔记七)
触摸事件 Sprite* sp1 = Sprite::create("Images/t1.png"); sp1->setPosition(Vec2(visibleSize.w ...
- asp.net出现正在中止线程解决方案
刚才又再次遇到了一个之前遇到的问题,在这里记录一下. 起因: 如果使用 Response.End.Response.Redirect 或 Server.Transfer 方法,将出现 ThreadAb ...
- hdu1069(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 分析: 每种石头有六种方法,那么等效为:有6*n种石头. 根据x和y排序(要保证相应的x.y总有 ...
- Kiwi Syslog server 日志服务器搭建
Kiwi syslog server 是一款很不错的日志服务器软件,安装过程就不多说,Linux 服务器日志由于本身就是syslog的,所以不用转换,但是windows 系统的日志格式是event形式 ...
- 该View转换成Bitmap方法
方法一: /** * 该View绘制到Bitmap上 * @param view 须要绘制的View * @param width 该View的宽度 * @param height 该View的高度 ...
- poj1655 Balancing Act 找树的重心
http://poj.org/problem? id=1655 Balancing Act Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- (step7.2.1)hdu 1395(2^x mod n = 1——简单数论)
题目大意:输入一个整数n,输出使2^x mod n = 1成立的最小值K 解题思路:简单数论 1)n可能不能为偶数.因为偶数可不可能模上偶数以后==1. 2)n肯定不可能为1 .因为任何数模上1 == ...
- cocos2d-x坐标系
在cocos2d-x在,有几种不同的坐标系. 因为有好几个坐标系着一定的差异,他们需要明白,能力更精确的绘制各种图形画面上. 1.屏幕坐标系 只windows通过绘制图形上基本都知道.相应的坐标系统: ...
- Windows Phone开发(28):隔离存储B
原文:Windows Phone开发(28):隔离存储B 上一节我们聊了目录的操作,这一节我们继续来看看如何读写文件. 首先说一下题外话,许多朋友都在摇摆不定,三心二意,其实这样的学习态度是很不好的, ...