C++ 内联函数的作用

  1. 什么是内联函数?
    内联函数的定义很简单,在函数定义前面加上关键字inline即可,例如:
inline void func(){
    //函数体
}

当程序编译的时候,其他调用func()函数的地方,会被func()函数的函数体替换,比如:

#include 
using namespace std;

inline void func(){
    //函数体
    int A = 3;
    cout<<A<<endl;
}
int main(){
    int A = 5;
    func();
    cout<<A<<endl;
    return 0;
}

程序在编译的时候,main()中的func()会被int A = 3; cout<代替。而且,内联函数里的局部变量依然只作用于函数体内。
2. 内联函数存在的意义是什么?

第一,提高函数调用效率。当函数仅有简单几行代码时,调用此函数的主要开销在调用机制上了,可能还要别的文件查询,而内联函数就节省了这一笔开销。但是需要注意的是,仅在函数功能十分简单的时候才有用。
第二,代替带参数的宏。#define A B可以将代码中的A在编译阶段都用B代替,但是当B是一个表达式的时候,会增加程序出现逻辑bug的风险。比如下面的代码:

#include 
using namespace std;
#define Q(x) x*x

int main(){
    int a = 1;
    cout<<Q(a+1)<<endl;
}

你会发现,程序输出结果并不是我们预想中的4,而是3,因为#define指令在编译的时候,只是简单粗暴的将Q(a+1)换成了a+1*a+1。当然,我们给第三行改成#define Q(x) (x)*(x),确实能够解决例子中的问题,但是如果Q(a+1)变成了10/Q(a+1),你会发现结果又不对了,因此#define在替换成表达式的时候需要格外小心,但是使用内联函数就不会有这么多顾虑了。

  1. 注意事项
    第一,不要在函数体比较复杂的时候使用;
    第二、内联函数在编译完了之后就消失了,所以不要将函数定义和函数调用写在不同文件(除非写在头文件),否则可能出现某个地方调用了该函数,但是链接器又找不到的情况。

你可能感兴趣的:(C++相关,c++,开发语言)