C++学习笔记09:内联函数 inline

目录

一、什么是内联函数?

二、普通函数调用

三、内联函数的写法

四、内联函数的优点

五、内联函数缺点

[六、inline 只是给编译器的建议](#六、inline 只是给编译器的建议)

七、内联函数和宏函数的区别

八、内联函数的注意事项

九、小结


一、什么是内联函数?

在C++中,可以使用 inline 关键字修饰函数,这种函数叫做内联函数

基本写法:

cpp 复制代码
inline int Add(int x, int y) {
    return x + y;
}

内联函数的作用是:

在函数调用的地方直接展开函数代码,减少函数调用的开销。

普通函数调用时,需要经历参数压栈、函数跳转、返回等过程。如果一个函数狠毒按,并且被频繁调用,这些调用的开销就可能比较明显。

使用 inline 后,编译器可能会把这些函数直接展开到调用位置。


二、普通函数调用

cpp 复制代码
#include <iostream>
using namespace std;

int Add(int x, int y)
{
    return x + y;
}

int main()
{
    int ret = Add(1, 2);
    cout << ret << endl;

    return 0;
}

这里调用 Add(1, 2) 时,会进入 Add 函数执行,执行再返回main函数。

对普通函数来说,这是正常调用的过程。


三、内联函数的写法

使用 inline 修饰函数:

cpp 复制代码
#include <iostream>
using namespace std;

inline int Add(int x, int y)
{
    return x + y;
}

int main()
{
    int ret = Add(1, 2);
    cout << ret << endl;

    return 0;
}

如果编译器选择内联展开,那么:

cpp 复制代码
int ret = Add(1, 2);

可能会被处理成类似:

cpp 复制代码
int ret = 1 + 2;

这样就减少了一次函数调用的开销。


四、内联函数的优点

内莱妮函数的主要优点是:

减少函数调用开销,提高程序运行效率。

它比较适合:

  1. 函数体比较短;
  2. 函数逻辑比较简单;
  3. 函数被频繁调用。

例如:

cpp 复制代码
inline int Max(int x, int y) {
    return x > y ? x : y;
}

这种函数比较短,适合写成内联函数。


五、内联函数缺点

内联函数并不是越多越好。

如果内联函数很长,还强行写成内联函数,可能会导致代码膨胀。

比如一个函数有很多行代码,如果每次调用都展开一份,最终生成可执行程序体积可能会变大。

所以简单可以理解为:

内联函数使用空间换时间。

它减少了函数调用时间,但增加了代码的体积。


六、inline 只是给编译器的建议

需要注意的是:

inline 只是做建议,不是命令。

也就是说,不是写了 inline ,编译器就一定会把函数展开。

如果函数太复杂,编译器可能会忽略 inline。

例如:

cpp 复制代码
inline void Func() {
    for (int i = 0; i < 1000; i++) {
        cout << i << emdl;
    }
}

这种函数逻辑比较复杂,基石写了inline ,编译器也不一定会真正展开。

一般来说,递归函数、代码比较长的函数,都不适合写成内联函数。


七、内联函数和宏函数的区别

C语言有时候会用宏函数:

cpp 复制代码
#define ADD(x, y) ((x) + (y))

C++中更推荐使用内联函数:

cpp 复制代码
inline int Add(int x, int y) {
    return x + y;
}

宏函数是在预处理阶段进行文本替换,没有类型检查,容易出错。

内联函数虽然可能会再调用出展开,但是他是真正的函数,具有类型检查,更安全。

简单对比:

对比点 宏函数 内联函数
处理阶段 预处理阶段 编译阶段
本质 文本替换 函数
类型检查 没有
调试 不方便 相对方便
安全性 较低 较高

所以在C++中,能用内联函数,一般不建议使用宏函数。


八、内联函数的注意事项

使用内联函数时需要注意:

  1. 函数体不要太长;
  2. 递归函数一般不适合内联;
  3. inline 只是建议,是否展开由编译器决定;
  4. 内联函数适合卸载头文件中;
  5. 类中直接定义的成员函数,默认具有内联属性。

例如:

cpp 复制代码
class Date {
public:
    void Print() {
        cout << "Date" << endll;
    }
};

这里 Print 函数直接在类里面定义,默认具有内联属性。


九、小结

本篇主要学习了C++中的内联函数。

需要记住:

  1. 内联函数使用 inline 修饰;
  2. 内联函数可能会在调用处展开;
  3. 内联函数可以减少函数调用开销;
  4. 内联函数适合短小、频繁调用的函数;
  5. 内联函数是用空间换时间;
  6. inline 只是给编译器的建议,不一定真正展开;
  7. C++中的内联函数可以替代一部分宏函数。

内联函数时C++中比较实用的语法,后面学习类和对象时,类里面定义的短小成员函数经常设计内联。

相关推荐
好评1241 小时前
【C++】智能指针全解
c++·智能指针
是阿建吖!1 小时前
【Linux】信号
android·linux·c语言·c++
城北徐宫1 小时前
Linux信号深度解剖:5种产生、3张表、4次切换
linux·c++·学习
liulilittle1 小时前
论 Linux 内核态全局稳态带宽的卡尔曼估计与工程实现
linux·服务器·网络·c++·计算机网络·tcp·通信
XBodhi.1 小时前
Visual Studio C++ 语法错误: 缺少“;”(在“return”的前面)
开发语言·c++·visual studio
froyoisle4 小时前
CSP-J 历年复赛 T1 及解析(2019~2025)
数据结构·c++·算法·csp-j·csp·算法竞赛·信息学
basketball6164 小时前
C++ 高级编程:2. 基本线程池实现
java·开发语言·c++
chao1898444 小时前
SGM(Semi-Global Matching)立体匹配算法 — C++ 实现
开发语言·c++·算法
10岁的博客4 小时前
IOI 2018 高速公路收费(Highway)题解:二分与树的巧妙结合
开发语言·c++
不知名的老吴4 小时前
C++运算符重载的常见注意点
开发语言·c++