漫步云端

移动开发(Android、iPhone、Windows Mobile) | JAVA | C | C++ | .net | Objective C | 微软企业开发技术 | 嵌入式系统设计与开发
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C++ inline函数

Posted on 2010-12-15 23:06  charley_yang  阅读(2163)  评论(0编辑  收藏  举报

   通常我们会把一系列的可能会被共有的小操作封装成一个函数供其他函数调用。比如min()函数封装了比较2个值大小的操作。

   但是C++调用一个函数被直接计算一段代码慢很多。不但必须拷贝两个实参,保存机器的寄存器,程序还必须转向一个新位置。

 

inline 内联函数给出了一种解决方案。

若一个函数被指定为inline 函数,则它将在程序中每个调用点上被内联地展开,例如: 
int minVal2 = min( i, j );
在编译时被展开为 
int minVal2 = i < j << i : j;
把 min()写成函数的额外执行开销从而被消除了在函数声明或定义中的函数返回类型前加上关键字 inline 即把 min()指定成为 inline:
inline int min( int v1, int v2 ) { /* ... */ }

 

   但是注意,inline 指示对编译器来说只是一个建议,编译器可以选择忽略该建议,因为把一个函数声明为inline 函数,并不见得真的适合在调用点上展开,例如 一个递归函数,或一个 1200行的函数也不太能在调用点展开

 

一般地 inline 机制用来优化小的只有几行的,经常被调用的函数。

 

注意事项:

 

1. 与非 inline函数不同的是 inline 函数必须在调用该函数的每个文本文件中定义

   当然,对于同一程序的不同文件,如果 inline 函数出现的话,其定义必须相同;对于由两个文件 compute.C和 draw.C构成的程序来说,不能定义这样的min()函数,它在 compute.C中指一件事情,而在 draw.C中指另外一件事情,如果两个定义不相同,程序将会有未定义的行为,编译器最终会使用这些不同定义中的哪一个作为非inline 函数调用的定义是不确定的,因而程序的行为可能并不像你所期望的 

2. 为保证不会发生这样的事情,建议把inline 函数的定义放到头文件中,在每个调用该 inline函数的文件中包含该头文件,这种方法保证对每个inline 函数只有一个定义,且程序员无需复制代码,并且不可能在程序的生命期中引起无意的不匹配的事情 。