欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++之内联函数inline的使用解析

程序员文章站 2022-03-10 17:30:55
概念 内联函数是指用inline关键字修饰的函数,在类内定义的函数被默认成内联函数。 内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。 内联函数不是在调用时发生控制转移,而是在编...

概念

内联函数是指用inline关键字修饰的函数,在类内定义的函数被默认成内联函数。

内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。 内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。 如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字inline,在调用函数之前需要对函数进行定义。如果已定义的函数多于一行,编译器会忽略 inline 限定符。 在类定义中的定义的函数都是内联函数,即使没有使用inline说明符。

下面是一个实例,使用内联函数来返回两个数中的最大值:

#include 

using namespace std;

class one {
private:
 int age;
 double len;

 inline int max(int x, int y) {
  return (x > y)  x : y;
 }
};

inline int min(int x, int y) {
 return (x < y)  x : y;
}

int main() {

 cout << "max(5, 6):" << max(5, 6) << endl;
 cout << "min(5, 6):" << min(5, 6) << endl;
 return 0;
}

结果:

max(5, 6):6

min(5, 6):5

process finished with exit code 0

引入内敛函数的目的:提高函数调用的效率。

内联函数特点:

函数体代码量应该较少,一般都是小函数,最好控制在10行以内; 内联函数不允许使用循环语句和开关语句; 内联函数的定义必须出现内联函数第一次调用之前; 在类结构中定义的函数就是类联函数。

内敛函数运行机制:当函数被声明为内敛函数以后,编译器会将内敛函数展开,不是按照通常函数调用机制进行调用。

内联函数的优缺点:

优点:函数体积小,代码运行高效。

缺点:滥用内联函数不易控制内存,很容易导致内存增加,这是典型的以空间换时间的函数。

inline函数放在头文件

关键字inline必须与函数定义体放在一起才能使函数成为内联,仅仅只是将inline放在函数声明前面没有任何实际作用。

下面函数不能成为内联函数:

inline void test();

void test() {
 cout << "useless function!" << endl;
}

下面函数为内敛函数:

void test();

inline void test() {
 cout << "useless function!" << endl;
}

内敛函数是一种用于“实现”的关键字,而不是用来“声明”的关键字。虽然inline函数可以出现在函数声明里面,加上部分书籍存在内联函数声明,但是为了规范inline关键字,请遵照c++函数实现的代码规范(虽然这不会影响函数功能)。请各位大佬认真注意这些细节!

我们也可以单独定义头文件,将内联函数放在其中,这样既能保证每次调用的函数都是相同的,也可以保证在调用点能够找到函数定义从而方便完成函数内联替换。如:

inlinefunc.h

#include 
using namespace std;

#ifndef inlinefunction_inlinefunc_h
#define inlinefunction_inlinefunc_h

#endif //inlinefunction_inlinefunc_h

inline double square(double n) {
 return n * n;
}

inline void printsomething(){
 cout << "this is inline function!" << endl;
}

main.cpp

#include 
#include "inlinefunc.h"

using namespace std;

int main() {
 printsomething();
 cout << "this number's square is " << square(5.0) << endl;
 return 0;
}

结果:

this is inline function!

this number's square is 25

process finished with exit code 0

面试题

一、内联函数和宏定义的区别?

参考答案:

1. 内联函数运行时可以调试,而宏定义不可以。

2. 编译器会对内联函数的参数类型做安全检查或自动类型转化,宏定义不会。

3. 内联函数可以访问类的成员变量,宏定义不能。

4. 在类中声名同时定义的成员函数,自动转化为内联函数。

5. 内联函数将代码直接插入调用处,减少普通函数调用资源,宏是在代码调用处不加任何验证的简单替换。

6. 内联函数是函数,宏不是函数。

二、内联函数在与类的作用关系?

在类中定义函数直接为内联函数,如果只是声明函数则可以不用(强迫症的我受不了,必须不用啊)内联函数。要是在类外需要声明内联函数必须加上inline关键字。