C++内联函数

以inline修饰的函数叫做内联函数,编译时 C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数是提升程序运行的效率。 

如有一个相加两数的函数:

int ADD(int a,int b){
    return a+b;
}

如果在上述函数前面添加inline关键字将其改成内联函数,在编译期间会替换调用函数体的函数的调用位置。这类似于C语言中的宏的替换:

#include<iostream>
using namespace std;
#define ADD(x,y) ((x)+(y))
#define ADD1(x,y) ((x)+(y));
int main() {
    cout << ADD(23, 87);
    //上述代码中的ADD替换成 宏中的内容 
    //cout<<((23)+(87));


    //宏后面不能加;是因为宏是完全替换的操作如下就会出错
    cout << ADD1(23, 24) << endl;
    //因为其替换之后代码为:
    //cout<<((23)+(24));<<endl;  所以一般不建议在宏后加;
}

宏优点:直接替换调用位置的代码,不用建立函数栈帧,提高效率

宏的缺点:

容易出错,语法细节要求多

而且宏不能调试(在预处理阶段就替换了)

还没有类型的检查(如我传一个int和char会导致结果不理想)

C++中就用:enum const inline来替代宏

enum和const是宏常量

inline是宏函数

而inline却跟正常函数一样,可以调式,有类型检查

使用inline函数的代码如下:

inline int ADD(int a,int b)
{
    int c=x+y;
    return c;
}
int main(){
    int ret1=ADD(23,2);
    //不用建立函数栈帧
    return 0;
}

从上可以看到其语法跟普通函数没有不同只是在函数前面加上了inline。

在release模式下,可以查看编译器生成的汇编代码中是否存在call Add ,而在debug模式下,需要对编译器进行设置,否则不会展开(替换)。

特性:

由上可知inline是一种以空间换时间的做法,如函数被编译器当做内联函数则会在编译阶段,会用函数体替换函数调用,这可能会导致文件变大,但是少了调用开销可以提高程序运行效率。

inline对于编译器来说只是建议,在不同的编译器中inline的实现也有所不同。

inline修饰:函数不是很大(取决于对应的编译器),不是递归,也不频繁调用的函数可以使用inline修饰,不然编译器会忽略inline的特性。

使用inline时并不建议将声明和定义分开,因为这样会导致链接错误,因为inline被展开,然后就没有了函数地址,链接就会找不到。

相关推荐

  1. C++函数

    2024-03-18 04:30:02       43 阅读
  2. C++基础】函数

    2024-03-18 04:30:02       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-18 04:30:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-18 04:30:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-18 04:30:02       82 阅读
  4. Python语言-面向对象

    2024-03-18 04:30:02       91 阅读

热门阅读

  1. 客户端渲染与服务端渲染

    2024-03-18 04:30:02       42 阅读
  2. 深入了解Android垃圾回收机制

    2024-03-18 04:30:02       53 阅读
  3. 从零开始的LeetCode刷题日记:541. 反转字符串II

    2024-03-18 04:30:02       43 阅读
  4. 如何解决接口幂等的问题?

    2024-03-18 04:30:02       46 阅读
  5. SpringSecurity

    2024-03-18 04:30:02       34 阅读
  6. Docker 新建网络实现容器间通信

    2024-03-18 04:30:02       43 阅读