page contents

C++ inline内联函数详解

函数是一个可以重复使用的代码块,CPU 会一条一条地挨着执行其中的代码。CPU 在执行...

函数是一个可以重复使用的代码块,CPU 会一条一条地挨着执行其中的代码。CPU 在执行主调函数代码时如果遇到了被调函数,主调函数就会暂停,CPU 转而执行被调函数的代码;被调函数执行完毕后再返回到主调函数,主调函数根据刚才的状态继续往下执行。

一个 C/C++ 程序的执行过程可以认为是多个函数之间的相互调用过程,它们形成了一个或简单或复杂的调用链条,这个链条的起点是 main(),终点也是 main()。当 main() 调用完了所有的函数,它会返回一个值(例如
return 0;)来结束自己的生命,从而结束整个程序。

函数调用是有时间和空间开销的。程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;函数体中的代码执行完毕后还要清理现场,将之前压入栈中的数据都出栈,才能接着执行函数调用位置以后的代码

如果函数体代码比较多,需要较长的执行时间,那么函数调用机制占用的时间可以忽略;如果函数只有一两条语句,那么大部分的时间都会花费在函数调用机制上,这种时间开销就就不容忽视。

为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数

指定内联函数的方法很简单,只需要在函数定义处增加 inline 关键字。请看下面的例子:



    1. #include <iostream>
    2. using namespace std;
    3. //内联函数,交换两个数的值
    4. inline void swap(int *a, int *b){
    5.     int temp;
    6.     temp = *a;
    7.     *a = *b;
    8.     *b = temp;
    9. }
    10. int main(){
    11. int m, n;
    12. cin>>m>>n;
    13. cout<<m<<", "<<n<<endl;
    14. swap(&m, &n);
    15. cout<<m<<", "<<n<<endl;
    16. return 0;
    17. }

运行结果:
45 99↙
45, 99
99, 45

注意,要在函数定义处添加 inline 关键字,在函数声明处添加 inline 关键字虽然没有错,但这种做法是无效的,编译器会忽略函数声明处的 inline 关键字。

当编译器遇到函数调用
swap(&m, &n)时,会用 swap() 函数的代码替换swap(&m, &n),同时用实参代替形参。这样,程序第 16 行就被置换成:



    1. #include <iostream>
    2. using namespace std;
    3. //声明内联函数
    4. void swap1(int *a, int *b); //也可以添加inline,但编译器会忽略
    5. int main(){
    6. int m, n;
    7. cin>>m>>n;
    8. cout<<m<<", "<<n<<endl;
    9. swap1(&m, &n);
    10. cout<<m<<", "<<n<<endl;
    11. return 0;
    12. }
    13. //定义内联函数
    14. inline void swap1(int *a, int *b){
    15. int temp;
    16. temp = *a;
    17. *a = *b;
    18. *b = temp;
    19. }


使用内联函数的缺点也是非常明显的,编译后的程序会存在多份相同的函数拷贝,如果被声明为内联函数的函数体非常大,那么编译后的程序体积也将会变得很大,所以再次强调,一般只将那些短小的、频繁调用的函数声明为内联函数。

内联函数看起来简单,但是有很多细节要引起重视。

最后需要说明的是,对函数作 inline 声明只是程序员对编译器提出的一个建议,而不是强制性的,并非一经指定为 inline 编译器就必须这样做。编译器有自己的判断能力,它会根据具体情况决定是否这样做。


attachments-2021-03-UQRahOR160598112ed77a.jpg

  • 发表于 2021-03-23 13:53
  • 阅读 ( 690 )
  • 分类:C/C++开发

0 条评论

请先 登录 后评论
小柒
小柒

1470 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章