• C++ inline函数



    一、定义和作用

      内联函数的作用主要是用来提高程序执行效率。如果函数是内联的,编译器在编译时,会把内联函数的实现替换到每个调用内联函数的地方,其和宏定义作类似,但宏函数不会进行类型检查。

      通常在进行函数调用时,其过程为:

    1. 在栈中为形参和局部变量分配存储空间,然后还要将实参的值复制给形参;
    2. 再将函数的返回地址(此地址指明了函数执行结束后,程序应该回到哪里继续执行)放入栈中;
    3. 最后跳转到函数内部执行;

      内联函数主要是解决函数的频繁调用,大量内存消耗的问题。

      我们可以知道,函数的调用就涉及到入栈出栈等问题,在这个过程中,传递参数、寄存器操作、返回值等会消耗额外的时间和内存,如果调用的函数代码量很少,也许转移到调用函数的时间比函数执行的时间更长。而如果使用内联函数,内联函数会在调用处将代码展开,从而节省了调用函数的开销。

      C++ 用 inline 关键字较好地解决了函数调用开销的问题。当程序执行到内联函数时,相当于复制了一份函数代码(内联函数会再调用处将代码展开)。相当于牺牲空间,赢得时间。也就是节省调用函数的开销。

    NOTE:内联说明只是向编译器发出一个请求,编译器可以选择忽略这个请求。

    在 C++ 中,可以在定义函数时,在返回值类型前面加上 inline 关键字,这函数就是内联函数。如:

    inline int sum(int a, int b)
    {
        return a + b;
    }
    
    • 1
    • 2
    • 3
    • 4

    二、内联函数适用情况

    • 不适用情况:递归函数、或函数中含有循环结构(浪费时间)、或函数代码过长(消耗内存)

    • 适用情况:内联一般在类中使用(函数内进行简单的赋值、或直接返回数据、或1~5条小语句)
      内联函数定义建议放在头文件中,但是不强制要求

    那为什么不能把所有的函数写成内联函数?

      因为内联函数以代码复杂为代价,它以省去函数调用的开销来提高执行效率。所以一方面如果内联函数体内代码执行时间相比函数调用开销较大,则没有太大的意义;另一方面每一处内联函数的调用都要复制代码,消耗更多的内存空间,因此以下情况不宜使用内联函数:

      函数体内的代码比较长,将导致内存消耗代价

      函数体内有循环,函数执行时间要比函数调用开销大

    三、define与inline的区别

    1. #define是关键字,inline是函数;
    2. 宏定义在预处理阶段进行文本替换,inline函数在编译阶段进行替换;
    3. inline函数有类型检查,相比宏定义比较安全;
  • 相关阅读:
    [machine learning]误差分析,模型分析
    字节二面:如果高性能渲染十万条数据?
    K8S排水错误汇总(忽略DaemonSet管理Pod、Mysql集群排水报错、Mongo集群排水报错)
    什么是图片的DPI?如何修改图片DPI值?
    闪烁霓虹灯文字动画
    Leetcode—13.罗马数字转整数【简单】
    我总结了3个做好事情的万能动作,简单高效!
    精准营销服务平台设计-基于大数据和AI的商业智能平台
    【Dolphinscheduler3.1.1】二次开发本地启动项目(前端+后端)
    深度学习算法
  • 原文地址:https://blog.csdn.net/CltCj/article/details/127659870