天天看点

【C++】深入基础——内联函数inline详解

inline内联函数(内置函数/内嵌函数)

前提了解:

函数调用  CPU一行行执行主调函数代码,在遇到被调用函数时,主调函数暂停,CPU去执行被调用函数的代码;当它执行完后 才返回主调函数,继续执行。这个过程有时间和空间的开销。

                 一个C/C++程序的执行过程可以认为是多个函数之间的相互调用过程,形成一个调用链条,链条起/终点为main()。

内联函数  在编译时就将函数调用处用函数体替换

#include <iostream>
using namespace std;

//内联函数,交换两个数的值
inline void swap(int *a, int *b){
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

int main(){
    int m, n;
    cin>>m>>n;
    cout<<m<<", "<<n<<endl;
    swap(&m, &n);
//相当于直接替换掉上面一行
/*int temp;
temp = *(&m);
*(&m) = *(&n);
*(&n) = temp;*/
    cout<<m<<", "<<n<<endl;

    return 0;
}
           

1.inline函数是用于实现的关键字,而不是用于声明的关键字

inline 必须与函数定义体放在一起才能使函数成为内联函数,仅将inline与函数声明放一起不起作用

2.内联函数应该放在头文件中定义

放在头文件中,其他源文件可以做一份拷贝(编译器做)

【C++】深入基础——内联函数inline详解
【C++】深入基础——内联函数inline详解
【C++】深入基础——内联函数inline详解

只要 inline 函数的定义在某个源文件中只出现一次,而且在所有源文件中,其定义必须是完全相同的即可。

内联函数替代宏

宏定义  #define是宏定义命令,将一个标识符定义为一个字符串,在预编译时将宏名(标识符)替换为字符串

//不带参数的宏定义--
#define PI 3.1415926
//宏名一般大写
//预编译:在编译之前,不做语法检查
//后面不加分号;
//可以用#undef命令终止宏定义的作用域
//宏定义不分配内存,变量定义分配内存

//带参数的宏定义
#define S(a,b) a*b
area=S(3,2);
//第一步被换为area=a*b; ,第二步被换为area=3*2;
           

宏定义弊端

#define  CALL_MAX_FUN(a, b)  f((a) > (b) ? (a) : (b))
  int a = 5, b=0;
  CALL_MAX_FUN(++a, b);              //a自增2次
//f((++a)>(b)?(++a):(b));
  CALL_MAX_FUN(++a, b+10);        //a自增1次
//f((++a)>(b+10)?(++a):(b+10)); 因判断否
           

同样的调用,竟然会因为参数的不同,导致a的结果值不同。

inline内联函数替换

template<typename T>
  inline void CallMaxFun(const T& a, const T& b)
  {
    f( a > b ? a : b);
  }
           

继续阅读