C++ 知识点06 inline

C++ inline 内联函数

一、什么是 inline 内联函数

普通函数 :调用时要 跳转→执行→返回,有函数调用开销

inline 内联函数

编译时把函数代码直接原地嵌入到调用处省去函数跳转开销,提升执行效率。

一句话:用代码替换函数调用,不跳转、省开销

二、基础语法

cpp 复制代码
inline 返回值 函数名(参数列表)
{
    // 函数体
}

三、基础示例代码

cpp 复制代码
#include <iostream>
using namespace std;
​
// 定义内联函数
inline int add(int a, int b)
{
    return a + b;
}
​
int main()
{
    // 编译时直接把 add(a,b) 替换成 a+b 代码
    cout << add(10, 20) << endl;
    cout << add(5, 6) << endl;
​
    return 0;
}

编译器处理后等价于:

cpp 复制代码
cout << 10 + 20 << endl;
cout << 5 + 6 << endl;

没有函数调用跳转,直接原地展开


四、为什么要用 inline?

  1. 省去函数调用的栈开辟、跳转、返回开销

  2. 代码短小、频繁调用的函数,用 inline 性价比最高

  3. #define 宏更安全、有类型检查、可调试


五、类内成员函数 默认就是 inline

写在类里面直接定义的成员函数,自带 inline 属性,不用手动加。

代码演示:

cpp 复制代码
#include <iostream>
using namespace std;
​
class Person
{
public:
    // 类内定义,默认隐式 inline
    void show()
    {
        cout << "我是类内默认内联函数" << endl;
    }
};
​
int main()
{
    Person p;
    p.show();
    return 0;
}

如果类内声明、类外定义 ,要手动加 inline

cpp 复制代码
#include <iostream>
using namespace std;
​
class Person
{
public:
    void show(); // 类内声明
};
​
// 类外定义,必须加 inline
inline void Person::show()
{
    cout << "手动加 inline" << endl;
}
​
int main()
{
    Person p;
    p.show();
    return 0;
}

六、inline 适用场景 & 不适用场景

✅ 适合用 inline

  • 函数代码很短(1~5 行)

  • 被频繁调用(循环里多次调用)

  • 简单计算、取值、设置值函数

❌ 不适合用 inline

  • 函数体代码很长

  • 包含 循环、if 多分支、递归、switch

  • 虚函数(多态)

编译器有内敛优化 :你写了 inline,它觉得不合适也会自动变成普通函数,不保证一定内联。


七、inline 函数规则(必记)

  1. inline 函数定义要放头文件,多个文件包含也不会报重复定义错误

  2. 不能定义递归内联函数

  3. 包含循环、复杂逻辑不建议 inline

  4. 只是建议编译器内联,不是强制(编译器有权拒绝)

演示:多文件共用 inline

同一个项目多个 .cpp 调用同一个 inline 函数,不用怕重复定义,这是 inline 特性。


八、inline 函数 VS 宏定义 #define

1. 宏写法(不安全)

cpp 复制代码
#define ADD(a,b) a+b

坑:无类型检查、优先级容易出错、容易产生诡异 bug。

2. inline 写法(安全)

cpp 复制代码
inline int add(int a, int b)
{
    return a + b;
}

区别总结:

特性 宏 #define inline 内联函数
类型检查
安全度 低,易出 bug
可调试 不可调试 可调试
作用 纯文本替换 类型安全代码展开

代码对比坑点:

cpp 复制代码
#include <iostream>
using namespace std;
​
#define MUL(x) x*x
inline int mul(int x) { return x*x; }
​
int main()
{
    // 宏:3+2*3+2 = 11  出错
    cout << MUL(3+2) << endl;
​
    // 内联函数:(3+2)*(3+2) = 25 正常
    cout << mul(3+2) << endl;
​
    return 0;
}

运行结果:

cpp 复制代码
11
25

一眼看出:宏有语法坑,inline 更安全


九、知识点一句话总结

  1. inline 作用:小函数原地展开,省去调用开销

  2. 类内直接定义的成员函数 默认隐式 inline

  3. inline 是给编译器建议,不强制

  4. 短小、频繁调用的函数用 inline;有循环、递归、代码长别用

  5. 比宏 #define 更安全、有类型检查、可调试

  6. inline 函数适合写在头文件,多文件引用不报错

相关推荐
khalil10201 小时前
代码随想录算法训练营Day-43 动态规划10 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
数据结构·c++·算法·leetcode·动态规划·子序列问题
ximu_polaris1 小时前
设计模式(C++)-行为型模式-解释器模式
c++·设计模式·解释器模式
曹牧2 小时前
C#:同一项目中维护多个版本的代码
开发语言·c#
青山师2 小时前
Java反射深度解析:运行时探查的艺术、代价与工程实践
java·开发语言·面试·反射·java程序员·java核心
skilllite作者2 小时前
Deer-Flow 工作流引擎深度评测报告
java·大数据·开发语言·chrome·分布式·架构·rust
likerhood2 小时前
Java的TimeUnit详细讲解
java·开发语言
2401_897190552 小时前
【C++高阶系列】告别内查找局限:基于磁盘 I/O 视角的 B 树深度剖析与 C++ 泛型实现!
java·c++·算法
沐知全栈开发2 小时前
Lua 数组
开发语言
xyq20242 小时前
优化堆排序
开发语言