C++_07_内联函数(inline) - 重写版

发布时间 2023-11-05 23:16:41作者: 尘落曦枫

内联函数(inline)

  在c++语言中可以使用
         const int A = 3; 
  代替  #define  A  3;       可以做到变量的替换,但是如果是需要替换更大的函数呢?

C++中使用inline关键字声明内联函数,使用内联函数替代代码片段,达到相似的效果!
注意:
       在函数定义时一定要加inline关键字,必须和函数体紧密相联,否则编译器会直接忽略内联请求。定义则没有这个要求,可以不加(先声明,后定义,定义和函数体紧密相联)
C++编译器可以将一个函数进行内联编译,被C++编译器内联编译的函数叫做内联函数

/** 
* 内联函数意义:
*    大范围替换代码片段,可以使用内联函数
* 注意:
*    内联函数声明时inline关键字必须和函数定义结合在一起,
*   否则编译器会直接忽略内联请求。(先声明后定义)
*/

#include <iostream>
using namespace std;

void printA(); //内联函数
void printB(); //普通函数

int main()
{
    printA();    //内联函数调用,完全宏文本替换,编译器操作
//  {   相当于这样
//      int a = 200;
//      cout<<"a = "<<a<<endl;
//  }
    //2 C++编译器直接将函数体插入在函数调用的地方
    //3 内联函数省去了普通函数调用时压栈,跳转和返回的开销 
    //4 一次调用看不出来效果,但是多次调用一个函数效果会比较明显
    //5 会占用较大代码段空间,但反应速度快啊

    printB();    //普通函数调用,每次调用都有压栈、跳转、返回开销
    return 0;
}

//inline关键字一定要和函数体紧密联系关联,只需要在定义函数体的时候进行inline申明即可 inline void printA() //内联函数 { int a = 200; cout << "a = " << a << endl; } void printB() //普通函数 { int b = 300; cout << "b = " << b << endl; }

 

 

深入理解:

    1、内联函数不需要声明时加inline, 但一定要在定义的时候加inline,inline关键字一定要和函数体紧密联系关联
    2、内联函数是纯文本替换,是编译器完成的,和宏定义在预处理的文本替换不一样,这个过程叫内联编译
    3、内联函数在最终生成的编译文件中是没有定义和意义的,他只在编写代码到编译代码期间有意义,因为一旦编译,生成的文件都是一样的编码符号;
    4、内联函数会增大代码段所占的数量,占用更大的内存资源,内联函数不需要承担函数调用时的压栈、跳转、返回的时间和资源开销(本质而言:用更大资源(主要内存)开销来换取更快的执行效率,等待浪费的时间少了嘛),所以一般短小精悍的函数代码片段建议使用内联
    5、内联inline关键字是对编译器采用内联编译的请求,编译器有可能拒绝或忽略,一旦拒绝或忽,内联函数就变成普通函数编译
    6、C++比较智能,在某些情况下即便你没加inline关键字采用内联函数,但编译器也会视情况采用内联(优化)编译
    7、C++内联函数的限制:不允许存在循环语句,不能存在过多的条件编译语句,适用于逻辑简单且需要多次执行的代码语句,函数体不能态过于庞大,还不能对内联函数进行取址操作
    8、内联函数最大的意义就是省去压栈、调用、返回时的开销,当函数体的执行效率远大于压栈、调用、返回时的开销时,内联函数将失去意义

 

 

处理一条语句使用内联函数和宏定义替换区别:
    1、使用内联函数是将语句封装为函数,宏定义替换不需要函数
    2、不涉及运算,只是文本打印的话,两者效果几乎差不多
    3、一旦涉及运算,内联函数是做好封装的,运算顺序已经完整规划排序完成,而宏定义替换只是替换文本,没有经历系统完整的运算顺序的规划,有一定的异变性