C++之内联函数(inline)

概念

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

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

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

#include <iostream>

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

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

内联函数特点:

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

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

内联函数的优缺点:

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

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

扫描二维码关注公众号,回复: 2355163 查看本文章

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 <iostream>
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 <iostream>
#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关键字。

猜你喜欢

转载自blog.csdn.net/qq_33567641/article/details/81178552