zoukankan      html  css  js  c++  java
  • C++内联函数

    C++内联函数总结

      本文摘自:http://c.biancheng.net/cpp/biancheng/view/134.html

      函数是一个可以重复使用的代码块,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 关键字,在函数声明处添加 inline 关键字虽然没有错,但这种做法是无效的,编译器会忽略函数声明处的 inline 关键字。
     5 inline void swap(int a, int b)
     6 {
     7     int temp;
     8     temp = a;
     9     a = b;
    10     b = temp;
    11     cout<<a<<", "<<b<<endl;
    12 }
    13 
    14 int main()
    15 {
    16     swap(1,2);
    17     swap(2,3);
    18     swap(3,4);
    19     swap(4,5);
    20     swap(5,6);
    21     swap(6,7);
    22     return 0;
    23 }

       对于上面的程序,每次遇到“swap()”函数时,都会被替换为:“int temp;temp = a;a = b;b = temp;cout<<a<<", "<<b<<endl;”,就像C语言的宏替换一样,这样做的好处是什么呢?

      首先需要注意的是,上面写的“swap()”这个函数是在文件编译时就被替换了,也就是说最终的主函数里面实际上是很多条语句的,因为我调用了那么多次“swap()”函数,每个都被替换成上面绿色部分的那么多语句了,这样的好处就是,程序真正开始运行时,跑到这里时不用再去另外调用“swap()”函数,直接执行被替换的东西就行了,这样以来就省去了电脑在来回调用函数时的开销。

      上面说的内联函数的优点里面,其实同时也说出来了内联函数的缺点,那就是:内联函数你每调用一次,都会被最终替换成那么多语句,实际上就是编译器又为你每次都再把那些语句多写了一次,这样以来,程序的体积就变大了。

      所以,综上所述:

      一般只将那些短小的、频繁调用的函数声明为内联函数。

      如果一个函数频繁调用,但是这个函数很长,那就不适合声明为内联函数,要不然每替换一次,就又多出来那么多语句,程序体积就太大了。

     内联函数与宏定义的区别

      内联函数与宏定义差不多,很“神似”,但其实不太一样。

      区别:

    1、编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;

    2、

     

  • 相关阅读:
    SpringMVC
    SpringMVC
    SpringMVC
    SpringMVC
    JavaWeb
    SpringMVC
    SpringMVC
    Spring
    Spring
    Spring
  • 原文地址:https://www.cnblogs.com/data-base-of-ssy/p/6962576.html
Copyright © 2011-2022 走看看