Effective C++ 深入理解inline
Effective C++ 深入理解inline
inline语义
inline本义是将所调用函数用自身的函数本体替换之,免受函数调用所招致的额外开销,比宏还要不易出错;但是实际上inline的受编译器的控制,编译器根据执行语境来对inline函数是否做优化,inline只是对编译器的申请,不是强制命令。
inline各种情况
1,如果函数体比较大,用inline关键字可能导致编译产生的目标文件过大,导致额外的换页行为,降低CPU高速缓存的命中率,效率有损失;当然如果inline函数本体很小,还可能导致更小的目标文件和更高的CPU SRAM的命中率。
2,有些简单的成员函数或friend函数,可能编译器会主动进行inline优化,隐式的inline
class Person {
public:
int height() const { return p_height; }
private:
int p_height;
}
3,template inline的组合通常定义在头文件中,因为大多数的build环境在编译的过程中进行inlining,为了将函数调用替换为函数体,编译器必须知道函数长什么样子。少量特殊情况会在link或runtime(托管环境下的C#)阶段替换,如果在写template时,没有必要将某个函数进行inline,就避免吧。
4,大部分编译器拒绝将太过复杂的函数inlining,而且对带有virtual函数的调用不做inline,virtual意味着运行时才决定调用哪个函数。
5,某个类的构造函数看起来是空的,使用inline合适,其实是错误的想法;
C++的对象在被创建和销毁时:创建一个对象,每个base class及每个成员会自动构造;销毁一个对象时,反向进行析构及销毁;如果遇到异常,编译器尝试的模板代码更多;一旦被inlined,所有子类都要插入base class构造函数的所有自动生成的代码,急速膨胀。
6,inline函数无法随着程序库的升级而升级。如果程序库中的f()重写了,inline函数必须重写编译。
7,多数调试器对调试inline函数无能为力(可在DEBUG版本中禁用inline)。
小结
1,将多数inline声明在小型,频繁调用的函数身上,为日后的调试和升级更容易,也可能使代码膨胀的问题最小化,提升程序性能;
2,不要把所有头文件中template函数inline。
参考
《Effective C++ 中文版》(第三版)
Effective C++ 深入理解inline的更多相关文章
- Effective Java通俗理解(持续更新)
这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...
- Effective Java通俗理解(下)
Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...
- Effective Java通俗理解(上)
这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...
- css -- 通俗理解inline、block、inline-block
display:inline; 内联元素,简单来说就是在同一行显示. display:block; 块级元素,简单来说就是就是有换行,会换到第二行. display:inline-block; 就是在 ...
- Effective C++ Item 30 inline里里外外
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie Item 44 46 1.将大多数 inlining 限制在小型.被频繁调用的函数身上.这可 ...
- 读书笔记 effective c++ Item 30 理解内联的里里外外 (大师入场啦)
最近北京房价蹭蹭猛涨,买了房子的人心花怒放,没买的人心惊肉跳,咬牙切齿,楼主作为北漂无房一族,着实又亚历山大了一把,这些天晚上睡觉总是很难入睡,即使入睡,也是浮梦连篇,即使亚历山大,对C++的热情和追 ...
- height与line-height的深入理解及应用
转载:原文地址:http://www.zhangxinxu.com/wordpress/?p=384 一.前言 前两天在腾讯ISD团队博客上看到一篇翻译的文章"深入理解css 行高" ...
- CSS行高line-height的理解
一.行高的字面意思 “行高“顾名思义指一行文子的高度.具体来说是指两行文子间基线间的距离. 基线是在英文字母中用到的一个概念,我们刚学英语的时候使用到的那个英语本子每行有4条线,其中底部第二条线就是基 ...
- [CSS]理解line-height
字面意思 "行高"顾名思意指一行文字的高度.具体来说是指两行文字间基线之间的距离.基线实在英文字母中用到的一个概念,我们刚学英语的时使用的那个英语本子每行有四条线,其中底部第二条线 ...
随机推荐
- 爬虫之pyquery库
官方文档:https://pyquery.readthedocs.io/en/latest/ PyQuery是一个强大又灵活的网页解析库.如果你觉得正则写起来太麻烦.BeautifulSoup语法太难 ...
- ndk编译libpcap 1.7.4(最终解决方法)
具体方法和测试见上一篇. 后来才知道,LIBPCAP本来就写了几套获取网卡的函数,这样就简单了.和上篇一样,把那5个文件从LINUX下托下来. 上篇忘了说了,还要将LINUX中/usr/include ...
- 洛谷 3979 BZOJ 3083 遥远的国度
[题解] 这道题除去根操作就是普通的树链剖分了.但是有换根操作怎么处理呢? 我们可以发现如果现在的根不在查询的点的子树里,那么对本次查询没有影响.如果现在的跟在查询的点x的子树里,那么答案将变为整棵树 ...
- zoj 1008 暴力枚举求解dfs+优化
/* 现将相同的合并计数. 再枚举判断是否符合当cou==n*n是符合就退出 */ #include<stdio.h> #include<string.h> #define N ...
- codevs3411 洪水
题目描述 Description 小浣熊松松和朋友到野外露营,没想到遇上了π年一次的大洪水,好在松松是一只爱观察的小浣熊,他发现露营地的地形和洪水有如下性质: ①露营地可以被看做是一个N*M的矩形方阵 ...
- resin4开启jmx
https://blog.csdn.net/liuxiao723846/article/details/51321010 https://blog.csdn.net/u010342008/articl ...
- Ubuntu 16.04安装XMind 8
下载: http://www.xmind.net/download/linux/ 解压 sudo unzip xmind-8-update2-linux.zip -d xmind8 移动到/opt目录 ...
- 使用Jsoup解析和操作HTML
jsoup 简单介绍 jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套很省力的API,可通过DOM.CSS以及类似于jQuery的操作方法来取 ...
- 【ora10,4】oracle后台进程介绍:
一.SMON(System MONitor) 系统监控进程: 在数据库启动过程中,SMON排在CKPT进程之后,在Oracle9i中排在第六号的位置: PMON started with p ...
- HDU 3008 DP
基础DP题 打BOSS BOSS和自己都有100点血.玩家先手 每回合能够选择施放技能攻击(耗蓝,共n种)或者普通攻击(不耗蓝,伤害为1),BOSS每回合会攻击自己q点血,每回合自己会恢复t点法力 ...