C++中的内联函数inline总结
C++中的内联函数inline总结
版权声明:本文为博主原创文章,未经博主允许不得转载。
突然看到C++Primer中讲到,对于vector的一个循环,调用语句:(示例代码i=v.begin()不是很规范,虽然不会出错,客官请将就着看)
- for (int i=v.begin() ; i<v.size() ; i++)
- {
- ....
- }
对于size()的调用,其实是内联。想到以前貌似是看《高质量C/C++编程》时,提过,在循环时,可以采用变量保存v.size()的值,以减少每个循环的调用开支。于是决定一搜,顺便总结之。
1、inline的引出
考虑下列min()函数(例子来自C++Primer第三版303页)
- int min( int v1, int v2 )
- {
- return( v1 < v2 << v1 : v2 );
- }
为这样的小操作定义一个函数的好处是:
a.如果一段代码包含min()的调用,那阅读这样的代码并解释其含义比读一个条件操作符的实例,可读性会强很多。
b.改变一个局部化的实现比更改一个应用中的300个出现要容易得多
c.语义是统一的,每个测试都能保证相同的方式实现
d.函数可以被重用,不必为其他的应用重写代码
不过,将min()写成函数有一个严重的缺点:调用函数比直接计算条件操作符要慢很多。那怎么能兼顾以上优点和效率呢?C++提供的解决方案为inline(内联)函数
2、inline的原理:代码替代
在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替代。
例如,如果一个函数被指定为inline 函数则它将在程序中每个调用点上被内联地展开例如
- int minVal2 = min( i, j );
在编译时被展开为
- int minVal2 = i < j << i : j;
则把min()写成函数的额外执行开销从而被消除了。
3、inline的使用
让一个函数成为内联函数,隐式的为在类里定义函数,显式的则是在函数前加上inline关键字说明。
4、使用inline的一些注意事项
a.从inline的原理,我们可以看出,inline的原理,是用空间换取时间的做法,是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。所以,如果函数体代码过长或者函数体重有循环语句,if语句或switch语句或递归时,不宜用内联
b.关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。内联函数调用前必须声明。《高质量C/C++编程》里一个例子。
- inline void Foo(int x, int y); // inline 仅与函数声明放在一起
- void Foo(int x, int y)
- {
- ...
- }
以上代码不能成为内联函数,而以下则可以
- void Foo(int x, int y);
- inline void Foo(int x, int y) // inline 与函数定义体放在一起
- {
- ...
- }
所以说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。对于以上例子,林锐还建议,只在定义前加上inline,而不是在声明和定义前都加,因为这能体现高质量C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈。
c.inline对于编译器来说只是一个建议,编译器可以选择忽略该建议。换句话说,哪怕真的写成了inline,也没有任何错误的情况下,编译器会自动进行优化。所以当inline中出现了递归,循环,或过多代码时,编译器自动无视inline声明,同样作为普通函数调用。
总结下:
楼主觉得可以将内联理解为C++中对于函数专有的宏,对于C的函数宏的一种改进。对于常量宏,C++提供const替代;而对于函数宏,C++提供的方案则是inline。在C中,大家都知道宏的优势,编译器通过复制宏代码的方式,省去了参数压栈,生成汇编的call调用,返回参数等操作,虽然存在一些安全隐患,但在效率上,还是很可取的。
不过函数宏还是有不少缺陷的,主要有以下:
a.在复制代码时,容易出现一想不到的边际效应,比如经典的
- #define MAX(a, b) (a) > (b) ? (a) : (b)
在执行语句:
- result = MAX(i, j) + 2 ;
时,会被解释为
- result = (i) > (j) ? (i) : (j) + 2 ;
b.使用宏,无法进行调试,虽然windows提供了ASSERT宏
c.使用宏,无法访问类的私有成员
所以,C++ 通过内联机制,既具备宏代码的效率,又增加了安全性,还可以自由操作类的数据成员,算是一个比较完美的解决方案。
关于宏,大家还可以参考下:http://dev.yesky.com/260/2095260.shtml,更原创,内容丰富,可取,http://wenku.baidu.com/view/1247bc22192e45361066f564.html总结了各家观点,稍微整理了下,不过还是蛮清楚的。
就这样吧,菜鸟goes on ~~~
C++中的内联函数inline总结相关推荐
- C++中的内联函数inline
1.Cpp中的内联函数 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方.对内联函数进行任何修改,都需要重新编译函数的所有客户端,因 ...
- 如何在C ++中实现内联函数?
Hey, folks! In this article, we will be unveiling a very powerful function offered by Inline functio ...
- 内联函数inline
结论在文章末尾处! 在C++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数. 内联函数的处理方式是在函数的调用点直接代码展开.在计算机系 ...
- C++内联函数(inline function)
c++从c中继承的一个重要特征就是效率.假如c++的效率明显低于c的效率,那么就会有很大的一批程序员不去使用c++了. 在c中我们经常把一些短并且执行频繁的计算写成宏,而不是函数,这样做的理由是为了执 ...
- 浅析MATLAB中的内联函数、匿名函数和函数函数
内联函数 内联(inline)函数是MATLAB 7以前经常使用的一种构造函数对象的方法.在命令窗口.程序或函数中创建局部函数时,通过使用inline构造函数,而不用将其储存为一个M文件,同时又可以像 ...
- java内联_JAVA中的内联函数
在说内联函数之前,先说说函数的调用过程. 调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到 转去执行该函数前的地方.这种转移操作要求在转去前要保护 ...
- C++中的内联函数和C中的宏定义的区别
在C++中内联函数: 内联函数即是在函数的声明和和定义前面加上"inline"关键字,内联函数和常规函数一样,都是按照值来传递参数的,如果参数为表达式,如4.5+7.5,则函数将传 ...
- ios内联函数 inline
ios内联函数 inline 缘由 由于在学习使用UIScrollVew开发的过程中,碰到下面这个属性(设置内边距): @property(nonatomic) UIEdgeInsets scroll ...
- [C++] 内联函数inline 以及 auto关键字 -- C++入门(4)
本篇文章主要包括内联函数和auto关键字.其中,内敛函数包括概念,特性等:auto关键字的使用规则,使用场景等. 目录 1.内敛函数 1.1问题引入: 1.2内联函数的概念 1.3内敛函数的特性 2. ...
最新文章
- 避免神经网络过拟合的5种技术
- 利用MAVEN打包可运行jar包,包括依赖的第三方包
- 微软热门知识点之------c#3.0新特性【转】
- 几句话描述简单算法——排序与搜索
- LeetCode 461. 汉明距离(异或^ 与)
- 网页挂码方式html css,CSS代码 解决网页挂马问题
- java中calendarr,Java学习(16)--System 类/Date 类/ Calendar类
- CVPR AAAI 2020 |人脸活体检测最新进展
- 推荐系统用户行为分析
- 说说VNode节点(Vue.js实现) 1
- HCI实验图常见类型
- 山东大学计算机组成课设,山东大学计算机组成原理课程设计实验报告.pdf
- Mesh网格编程(三) 正12面体
- power BI爬取网页数据方法
- 一道智商测试题 月薪三万
- 【前端】基于layui写的一个高级搜索(筛选)功能
- 我用python代码表白,泡到了大学小师妹
- IIS 6 UrlRewrite 步骤
- 喜报!签约招商证券,字根科技错别字检测再创佳绩
- 越多的人入局棋牌游戏开发行业,游戏产品突出竞技元素
热门文章
- Cambridge eap essay 1
- IPHONE 64位和32位
- Centos 7 mysql Buffered warning: Changed limits: max_connections: 214 解决方法
- uboot学习之三-----uboot启动第一阶段--start.S之一
- HP MSA2000-硬盘leftover-trust enable处理
- 关于expres模板引擎,Function,with
- Qt窗口屏幕居中显示 (ZT)
- DotNetNuke出错:“Runat 属性必须具有值 Server(The Runat attribute must have the value Server Error)...
- 开源怎么挣钱(转帖收藏)
- HD 1159 Common Subsequence (最长公共子序列)