天天看点

c++-inline 内联函数

为什么要使用内联函数:

当程序调用函数时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作需要系统时间和空间的开销。在有些情况下,函数本身很小很简单,但是使用频率很高,程序频繁的调用这些函数,就会是cpu的大多数开销花费在建立栈空间,保护现场,程序转移等工作上

inline 只是一个标记,要不要把函数转换为内联函数还要编译器说了算,一般在函数中存在switch,for等循环语句,即便声明了inline编译器也不会转换为内联函数。

改进:

为了提高程序的效率,一般要把代码嵌入到主函数中,但是又会出现很多重用的代码,可读性也会减差

解决:

c++提供了内敛函数

inline函数与宏定义的区别:

(1)内敛函数被调用时,要求实参和形参的类型一致,另外内联函数会先对实参表达式求值然后传递给形参,宏调用只是对实参简单的替换

(2)内联函数在编译的时候进行展开,宏定义是在预处理阶段替换

不要随便使用内联函数,因为内联函数会是函数体增长,一般讲函数本身很简单,代码短,使用频率高的函数定义为inline函数

类中的成员函数,类内声明默认为inline函数,不必要加inline修饰,在类外定义时必须加inline修饰才是内敛函数

                              类内声明定义的函数默认为inline函数,

                              并不是所有的内敛函数都生效.

注意:

将一般函数指定为内联函数时,只要在函数的声明或函数定义时两者之一做inline声明即可。

但如果将类函数指定为内敛函数时,应当注意:如果在类体外定义inline函数,则必须将类定义和用到该函数的函数放在同一个文件中。

 下面看一个例子:

//A.h  类声明文件
#ifndef _A_H_
#define _A_H_

class A
{
public:
	inline int add(int a, int b);
};

#endif  //_A_H_:
           
//A.cpp 类实现文件
#include "A.h"

inline int A::add(int a, int b)
{
	return a+b;
}
           
//test.cpp 测试文件 
#include "A.h"
#include <iostream>

using namespace std;

int main()
{
	A a; 
	cout<<a.add(2,4)<<endl;    //编译是通不过,因为在这个文件下找不到用来做替换的内联函数
	return 0;
}
           

错误分析:niline函数是用来进行替换,替换的函数是在本文件内找,找不到就认为是没有定义的。即便是在A.cpp中定义了,test.cpp只能调用A.cpp的函数,而不能拿来做替换。

修改方式有两种:

(1)在类的声明中定义

//A.h  类声明文件
#ifndef _A_H_
#define _A_H_

class A
{
public:
	inline int add(int a, int b)
	{
		return a+b;
	}
};

#endif  //_A_H_:
           
//A.cpp 类实现文件
#include "A.h"
           
//test.cpp 测试文件 
#include "A.h"
#include <iostream>

using namespace std;

int main()
{
	A a; 
	cout<<a.add(2,4)<<endl;    //6
	return 0;
}
           

分析:有人会说现在test.cpp中也没有inline函数的实现,其实编译过程中,include “A.h‘ 是将A.h的代码替换这条语句,因此,inline函数和调用inline的函数是在一个文件夹中的

(2)在test.cpp中定义incline函数

//A.h  类声明文件
#ifndef _A_H_
#define _A_H_

class A
{
public:
	inline int add(int a, int b);
};

#endif  //_A_H_:
           
//A.cpp 类实现文件
#include "A.h"
           
//test.cpp 测试文件 
#include "A.h"
#include <iostream>

using namespace std;

inline int A::add(int a, int b)
{
	return a+b;
}

int main()
{
	A a; 
	cout<<a.add(2,4)<<endl;    //6
	return 0;
}
           

继续阅读