C++ 内联函数使用
2015-01-16 14:29
288 查看
1、inline的引出
考虑下列min()函数(例子来自C++Primer第三版303页)[cpp] view
plaincopy
int min( int v1, int v2 )
{
return( v1 < v2 << v1 : v2 );
}
为这样的小操作定义一个函数的好处是:
a.如果一段代码包含min()的调用,那阅读这样的代码并解释其含义比读一个条件操作符的实例,可读性会强很多。
b.改变一个局部化的实现比更改一个应用中的300个出现要容易得多
c.语义是统一的,每个测试都能保证相同的方式实现
d.函数可以被重用,不必为其他的应用重写代码
不过,将min()写成函数有一个严重的缺点:调用函数比直接计算条件操作符要慢很多。那怎么能兼顾以上优点和效率呢?C++提供的解决方案为inline(内联)函数
2、inline的原理:代码替代
在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替代。例如,如果一个函数被指定为inline 函数则它将在程序中每个调用点上被内联地展开例如
[cpp] view
plaincopy
int minVal2 = min( i, j );
在编译时被展开为
[cpp] view
plaincopy
int minVal2 = i < j << i : j;
则把min()写成函数的额外执行开销从而被消除了。
3、inline的使用
让一个函数成为内联函数,隐式的为在类里定义函数,显式的则是在函数前加上inline关键字说明。4、使用inline的一些注意事项
a.从inline的原理,我们可以看出,inline的原理,是用空间换取时间的做法,是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。所以,如果函数体代码过长或者函数体重有循环语句,if语句或switch语句或递归时,不宜用内联b.关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。内联函数调用前必须声明。《高质量C/C++编程》里一个例子。
[cpp] view
plaincopy
inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y)
{
...
}
以上代码不能成为内联函数,而以下则可以
[cpp] view
plaincopy
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.在复制代码时,容易出现一想不到的边际效应,比如经典的
[cpp] view
plaincopy
#define MAX(a, b) (a) > (b) ? (a) : (b)
在执行语句:
[cpp] view
plaincopy
result = MAX(i, j) + 2 ;
时,会被解释为
[cpp] view
plaincopy
result = (i) > (j) ? (i) : (j) + 2 ;
b.使用宏,无法进行调试,虽然windows提供了ASSERT宏
c.使用宏,无法访问类的私有成员
所以,C++ 通过内联机制,既具备宏代码的效率,又增加了安全性,还可以自由操作类的数据成员,算是一个比较完美的解决方案。
相关文章推荐
- C++中如何使用内联函数
- C++总是能让我想起什么(6)——C++内联函数的使用
- [C++]实验四:掌握内联函数的使用、参数个数不确定的函数的设计...
- 规范使用C++内联函数
- c++ 内联函数使用技巧
- 内联函数inline的使用探索(来自C++primer plus)
- c++内联函数(inline)使用详解
- [C++]关于内联函数的使用
- C++ 内联函数的使用
- C++中内联函数inline的使用方法
- C++中内联函数的定义和使用
- c++内联函数(inline)及内联函数的使用及注意点
- C++ inline内联函数使用规则
- C++中内联函数的定义和使用
- C++中内联函数的使用学习笔记
- 在C++使用内联函数的一些限制
- c++内联函数(inline)使用详解
- C++ inline内联函数使用注意事项
- 面向对象的Windows编程实战(上)(使用C++和Win32 API)
- 【C++】宏定义与内联函数