C++inline函数浅析

写出几个最近联系中碰到的东西,记录下来也是害怕自己忘了,西瓜书也是在最近第一遍看完了,后面还要更上python的练习,害怕两种语言弄混淆,所以一起练习,毕竟不是科班出身。
这里写图片描述
1.inline的引出
基本上大家都是参考林锐的那本C\C++高质量编程来进行总结的,以前看过一遍,没多大印象,毕竟当时基础太差,不适合看那本书,怪不得师兄说他每年都要看一遍。

在C++中我们通常定义以下函数来求两个整数的最大值:

int max(int a, int b)
{
    return(a>b?a:b);
}

为这样的小操作定义一个函数的好处是:
a.如果一段代码包含max()的调用,那阅读这样的代码并解释其含义比读一个条件操作符的实例,可读性会强很多。
b.改变一个局部化的实现比更改一个应用中的300个出现要容易得多
c.语义是统一的,每个测试都能保证相同的方式实现
d.函数可以被重用,不必为其他的应用重写代码
虽然有这么多好处,但是写成函数有一个潜在的缺点:调用函数比求解等价表达式要慢得多。在大多数的机器上,调用函数都要做很多工作:调用前要先保存寄存器,并在返回时恢复,复制实参,程序还必须转向一个新位置执行。那怎么能兼顾以上优点和效率呢?C++提供的解决方案为inline(内联)函数

C++中支持内联函数,其目的是为了提高函数的执行效率
2、inline的原理:代码替代
在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替代。
例如,如果一个函数被指定为inline 函数则它将在程序中每个调用点上被内联地展开例如

 inline int max(int a, int b)
{
 return a > b ? a : b;
}

则调用: cout<<max(a, b)<<endl;

在编译时展开为: cout<<(a > b ? a : b)<<endl;
从而消除了把 max写成函数的额外执行开销。

3.使用内联
让一个函数成为内联函数,隐式的为在类里定义函数,显式的则是在函数前加上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 程序设计风格的一个基本原则:声明与定义不可混为一谈。

5.内联函数与宏比较
无论是《Effective C++》中的 “Prefer consts,enums,and inlines to #defines” 条款,还是《高质量程序设计指南——C++/C语言》中的“用函数内联取代宏”,宏在C++中基本是被废了,在书《高质量程序设计指南——C++/C语言》中这样解释到:
在C程序中,可以用宏代码提高执行效率。宏代码本身不是参数,但使用起来像函数。编译预处理用拷贝宏代码的方式取代函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,从而调高了速度。使用宏代码最大的缺点是容易出错,预处理器在拷贝宏代码时常常产生意想不到的边际效应。比如经典的

#define MAX(a, b) (a) > (b) ? (a) : (b) 

在执行语句:

result = MAX(i, j) + 2 ;  

时,会被解释成

result = (i) > (j) ? (i) : (j) + 2 ;  

b.使用宏,无法进行调试,虽然windows提供了ASSERT宏
c.使用宏,无法访问类的私有成员
所以,C++ 通过内联机制,既具备宏代码的效率,又增加了安全性,还可以自由操作类的数据成员,算是一个比较完美的解决方案。
所以在C++程序中应该尽量用内联函数来取代宏代码,断言assert恐怕是唯一的意外。

内联函数的另一个优点是:函数被内联后,编译器就可以通过上下文相关的优化技术对结果代码执行更深入的优化,而这种优化在普通函数体内是无法单独进行的,因为一旦进入函数体内它也就脱离了调用环境的上下文。

友情链接:http://dev.yesky.com/260/2095260.shtml

参考博客1:http://blog.csdn.net/u011327981/article/details/50601800
参考博客2http://blog.csdn.net/coder_xia/article/details/6723387

感谢上述博主的总结,好了就先到这吧!
更多深入的内容请移步其他相关推荐博客!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值