Effective C++ 笔记:条款 30 inline
30 : Understand the ins and outs of inlining
1 inline申请书
1.1 类内部实现函数包含隐藏的inline申请
class Human {
public:
Human() { } // 这个也是inline函数吗?参考3.2
int age() const { return m_age; } //隐喻的内联申请
private:
int m_age;
};
1.2 virtual与inline
一个virtual函数不可能是inline函数,或者说不可能是inline候选人。virtual为运行时派,而inline是编译时派。
1.3 模版与inline
如果可能或没有必要,请不要使用inline,来避免代码量的增加。
1.4 如果inline申请失败的话
请不要担心,编译器会给出一个警告。(见条款53)
2 inline的模样
2.1 inline的位置和处理
inline函数通常被放置在头文件中,因为大部分编译器在编译阶段进行内联函数展开。而少数编译器,例如.Net CLI(Common Language Infrastructrue)可在运行时期完成内联,这是绝对的例外。inline函数应该在编译阶段被处理。
3 inline障眼法
3.1 力不从心的编译器
有时候编译器想inlining一个函数,但他不能这么做。例如需要获取一个函数的地址时,还是不得不产生一个函数本体。
3.2 构造析构函数与inline所带来的思考
这两者为inline的糟糕候选人。
C++保证了一系列的发生动作,然而并没有保证动作如何发生。
如果一个类有许多的成员变量,那他们将在构造函数中进行默认构造。我们知道这件事会发生,但不清楚编译器如何进行这些操作。假设每个操作都是异常安全的,并且析构函数为inline,那么构造函数中将会出现大量的自身的析构函数副本、成员变量的析构函数副本,构造函数将变得异常庞大。当类有继承关系时,情况更糟糕。
4 重视inline
4.1 评估inline冲击
修改inline函数将导致客户的与该函数相关的代码全部重新编译。
4.2 调试器束手无策
调试器对一个没有本体的函数束手无策,你应该去何处打断点呢?
4.3 黄金法则 80-20
起初不要进行inline声明,找出那80%的时间在运行的20%的代码进行inline优化。 这条法则也说明了先实现再优化的办事原则,而inline属于优化阶段。
请记住
1 将大多数inlinin限制在小型、频繁调用的函数身上,这可是日后的调试过程和二进制升级(binary upgradability)更容易,也可使潜在的代码膨胀问题最小化,是程序的速度提升机会最大化。
2 不要只因为function templates出现在头文件就将他们声明为inline,
专业词汇
指令高速缓存装置的击中率(instruction cache hit rate)
二进制升级(binary upgradability)
CLI(Common Language Infrastructrue)
Effective C++ 笔记:条款 30 inline的更多相关文章
- [Effective JavaScript 笔记]第30条:理解prototype、getPrototypeOf和__ptoto__之间的不同
原型包括三个独立但相关的访问器.这三个单词都是对单词prototype做了一些变化. C.prototype用于建立由new C()创建的对象的原型 Object.getPrototypeOf(obj ...
- Effective STL 学习笔记 Item 30: 保证目标区间足够大
Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...
- [Effective JavaScript 笔记]第3章:使用函数--个人总结
前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...
- Effective C++笔记:实现
条款26:尽可能延后变量定义式的出现时间 博客地址:http://www.cnblogs.com/ronny/ 转载请注明出处! 有些对象,你可能过早的定义它,而在代码执行的过程中发生了导常,造成了开 ...
- Effective C++笔记05:实现
条款26:尽可能延后变量定义式的出现时间 博客地址:http://blog.csdn.net/cv_ronny 转载请注明出处! 有些对象,你可能过早的定义它,而在代码运行的过程中发生了导常,造成了開 ...
- Effective C++ 50条款
条款1:尽量用const和inline而不用#define 以const 行使常量折叠,用inline 代替常用操作的宏定义,而且库里面有很多常用函数可用.当然不能抛弃宏,宏还是很有用滴.偶最近才发现 ...
- Effective C++笔记(五):实现
参考:http://www.cnblogs.com/ronny/p/3754755.html 条款26:尽可能延后变量定义式的出现时间 有些对象,你可能过早的定义它,而在代码执行的过程中发生了导常,造 ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象
js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...
随机推荐
- 如何查看k8s存在etcd中的数据(转)
原文 https://yq.aliyun.com/articles/561888 一直有这个冲动, 想知道kubernetes往etcd里放了哪些数据,是如何组织的. 能看到,才有把握知道它的实现和细 ...
- 团队第二次 # scrum meeting
github 本此会议项目由PM召开,召开时间为4-3日晚上9点 召开时长15分钟 任务表格 袁勤 学习SpringBoot https://github.com/buaa-2016/phyweb/i ...
- 一、CSS介绍
CSS介绍 1.css概述: CSS指层叠样式表 CSS样式表极大地提高了工作效率 selector{ property:value } 注:property(属性)大于1之后,property之间用 ...
- liunx 部署 spring boot
Xshell for Xmanager Enterprise 4 (Build 0232)Copyright (c) 2002-2014 NetSarang Computer, Inc. All ri ...
- win10安装mysql一直卡在最后一步进行不下去
新买的电脑,mysql的win10一直安装不了,一直卡在最后一步.仔细阅读下面文章解决. https://blog.csdn.net/fpga_zy/article/details/80689265
- C语言的基础输入输出
首先来整理一下各个数据类型的输入输出格式: 1.char %c 2.int/short int %d 3.long int %ld 4.long long int %lld 5.float %f 6. ...
- 学习笔记:FIS3
http://fis.baidu.com/ FIS3官网 [配环境]: 1.先要安装node.js https://nodejs.org/en/ NODE.js官网(下载这个,下载后运行: http ...
- 高校手机签到系统——第一部分Authority权限系统(上)
序:今天开始写一个算是我第一个系列的文章——高校手机签到系统.本系统结合我们学校自身的一些特点编写.这是我的毕业设计项目,写在这里算是给最后论文的时候一些点滴的记录.另外也想通过这个系列的文章找到一份 ...
- Centos nginx安装
1.下载nginx http://nginx.org/en/download.html 2.上传到服务器上,并解压: rz 后选择上传的文件 tar -zxvf /fish/download/ngin ...
- Python 进行查询日志查询条件分析
任务:crm日志的查询条件 每次是哪几个字段查,有几种组合 ,统计每种组合查询的量 日志样例: -- ::] -- ::] 查询条件:query查询条件可以多个,用|and|分割. 步骤: 1.正则 ...