C++ 内联(inline)函数

inline是C++关键字,在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数。

在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间的问题,特别的引入了inline修饰符,表示为内联函数。内联函数实质是在调用点将函数展开,从而减少了对堆栈的操作(在堆栈中调用函数较为复杂,直接展开为代码运行效率更高)。

内联函数牺牲了空间但是降低了调用函数时的额外开销,以空间换时间,在大部分情况下时值得的。

内联函数的使用方法

在class之外,多一个inline修饰符。

class A{
private:
    /*...*/
public:
    /*...*/
    int add(int x,int y) {return x+y;}    
    /*...*/
}
/*
如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上inline,否则就认为不是内联的
*/
inline int A::add(int x,int y){
    /*...*/
}
inline int add1(int x,int y){
    /*...*/
}

在class之内定义的函数是自动内联的。

class A{
private:
    /*...*/
public:
    /*...*/
    int add(int x,int y) {return x+y;}    
    /*...*/
}

内联函数的使用规则

  1. inline说明对编译器来说只是一种建议,编译器可以选择忽略这个建议。对于过大的函数,编译器会忽略inline。

  2. 关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用,inline函数实质上是一种声明,最好直接将内联函数定义一起放在.h文件中。

使用inline的时机

代码短小(例如只有2、3行)且多次调用。

若函数较大或有递归调用(Recursive functions)则不使用inline。

inline函数与宏函数的差异

  1. 宏调用是通过简单文本替换来实现的,不会对参数进行类型检查。

  2. 宏的使用是预处理器直接对宏代码进行调用,没有参数压栈、生成相应汇编代码、返回参数等时间花费。

  3. 宏可能会产生意想不到的边缘效应,很容易出错,要非常小心优先级的变动。

内联

  1. inline 对编译器来说是一种请求,而不是命令。

  2. C++中的内联机制既具备宏代码的效率,又增加了安全性,可以自由操作类的数据成员,而宏代码无法操作类的私有成员。

例如对于下面代码

#include<iostream>
#define add1(x,y)	((x)+(y)) //宏定义
using namespace std;
inline int add2(int x,int y){ //内联
	return x+y;
}
int main()
{
	double a=1.0,b=2.0;
	printf(" %d \n",add1(a,b));
	printf(" %d \n",add2(a,b));
return 0 ;
}

得到结果

0//宏没有对类型检测
3//inline进行了强制类型转化

因而建议在c++中用inline函数代替宏函数

posted @ 2020-06-06 16:48  海物chinono  阅读(193)  评论(0)    收藏  举报