- 1、本文档共3页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C中的内联函数inline总结
C++中的内联函数inline 总结
1、inline 的引出
1) 考虑下列min()函数(例子来自C++Primer 第三版303 页)
1. int min( int v1, int v2 )
2. {
3. return( v1 v2 v1 : v2 );
4. }
为这样的小操作定义一个函数的好处是:
a.如果一段代码包含min()的调用,那阅读这样的代码并解释其含义比读一个条件操作
符的实例,可读性会强很多。
b.改变一个局部化的实现比更改一个应用中的300 个出现要容易得多
c.语义是统一的,每个测试都能保证相同的方式实现
d.函数可以被重用,不必为其他的应用重写代码
不过,将min()写成函数有一个严重的缺点:调用函数比直接计算条件操作符要慢很多。
2) 在C 中,大家都知道宏的优势,编译器通过复制宏代码的方式,省去了参数压栈,生
成汇编的call 调用,返回参数等操作,虽然存在一些安全隐患,但在效率上,还是很可取的。
不过函数宏还是有不少缺陷的,主要有以下:
a.在复制代码时,容易出现一想不到的边际效应,比如经典的
1. #define MAX(a, b) (a) (b) ? (a) : (b)
在执行语句:
1. result = MAX(i, j) + 2 ;
时,会被解释为
1. result = (i) (j) ? (i) : (j) + 2 ;
b.使用宏,无法进行调试,虽然windows 提供了ASSERT 宏
c.使用宏,无法访问类的私有成员
由于1)提出的可读性和2)提出的高效性,C++提供了一种inline (内联)的解决方
案,来兼顾两者的优点。
2、inline 的原理:代码替代
在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来
进行替代。例如,如果一个函数被指定为inline 函数则它将在程序中每个调用点上被内联
地展开例如
1. int minVal2 = min( i, j );
在编译时被展开为
1. int minVal2 = i j i : j;
则把min()写成函数的额外执行开销从而被消除了。
3、inline 的使用
让一个函数成为内联函数,隐式的为在类里定义函数,显式的则是在函数前加上inline
关键字说明。
4、使用inline 的一些注意事项
a.从inline 的原理,我们可以看出,inline 的原理,是用空间换取时间的做法,是以代
码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行
函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。所以,如果函
数体代码过长或者函数体重有循环语句,if 语句或switch 语句或递归时,不宜用内联
b.关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函
数声明前面不起任何作用。内联函数调用前必须声明。《高质量C/C++编程》里一个例子。
1. inline void Foo(int x, int y); // inline 仅与函数声明放在一起
2. void Foo(int x, int y)
3. {
4. ...
5. }
以上代码不能成为内联函数,而以下则可以
1. void Foo(int x, int y);
2. inline void Foo(int x, int y) // inline 与函数定义体放在一起
3. {
4. ...
5. }
所以说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。对于以
上例子,林锐还建议,只在定义前加上inline,而不是在声明和定义前都加,因为这能体现
高质量C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈。
c.inline 对于编译器来说只是一个建议,编译器可以选择忽略该建议。换句话说,哪怕
真的写成了inline,也没有任何错误的情况下,编译器会自动进行优化。所以当inline 中出
现了递归,循环,或过多代码时,编译器自动无视inline 声明,同样作为普通函数调用。
5、总结:
可以将
文档评论(0)