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?
-
省去函数调用的栈开辟、跳转、返回开销
-
代码短小、频繁调用的函数,用 inline 性价比最高
-
比
#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 函数规则(必记)
-
inline 函数定义要放头文件,多个文件包含也不会报重复定义错误
-
不能定义递归内联函数
-
包含循环、复杂逻辑不建议 inline
-
只是建议编译器内联,不是强制(编译器有权拒绝)
演示:多文件共用 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 更安全。
九、知识点一句话总结
-
inline作用:小函数原地展开,省去调用开销 -
类内直接定义的成员函数 默认隐式 inline
-
inline 是给编译器建议,不强制
-
短小、频繁调用的函数用 inline;有循环、递归、代码长别用
-
比宏
#define更安全、有类型检查、可调试 -
inline 函数适合写在头文件,多文件引用不报错