C++ inline
内联函数(Inline Function)
inline
内联函数 是一种优化函数调用的方法,告诉编译器将函数代码直接插入调用处,避免普通函数调用的栈帧开销,提高小函数的执行效率。
1. inline
的作用
- 减少函数调用开销(消除
CALL
指令) - 提高小函数的执行速度
- 适用于 短小、频繁调用的函数
- 不适用于 大函数(代码膨胀),递归,虚函数
2. inline
基本语法
#include <iostream>
// ✅ `inline` 关键字告诉编译器优化这个函数
inline int add(int a, int b) {
return a + b;
}
int main() {
std::cout << add(3, 4) << std::endl; // ✅ 直接插入 `return 3 + 4;`
}
📌 编译后 add(3, 4)
直接展开为 return 3 + 4;
,避免函数调用。
3. inline
如何优化函数调用
(1)普通函数的调用
普通函数调用涉及:
- 压栈(Push arguments)
- 跳转到函数地址
- 执行函数
- 返回值
- 恢复栈帧
int add(int a, int b) { return a + b; }
int main() {
int result = add(3, 4);
}
汇编示例
call add ; 传统调用,导致函数跳转
mov eax, result
(2)inline
展开函数
inline int add(int a, int b) { return a + b; }
int main() {
int result = add(3, 4); // ✅ 直接展开为 `int result = 3 + 4;`
}
汇编优化
mov eax, 7 ; ✅ 直接计算,不调用函数
mov result, eax
📌 消除了 call
指令,提升执行效率!
4. inline
适用场景
✅ 适用于
- 小函数(1~5 行代码)
- 频繁调用的函数
- 简单的
getter/setter
❌ 不适用于
- 递归函数(无法展开)
- 虚函数(
vtable
调用无法内联) - 大函数(代码膨胀,降低缓存命中率)
5. inline
在类中的应用
✅ 类内定义的函数默认是 inline
class Test {
public:
inline void show() { std::cout << "Inline function\n"; } // ✅ 明确 `inline`
};
📌 类内定义的函数,默认就是 inline
,不需要额外写 inline
:
class Test {
public:
void show() { std::cout << "Inline function\n"; } // ✅ 也是 `inline`
};
6. inline
vs. 宏
📌 inline
比 #define
更安全
#define SQUARE(x) (x * x) // ❌ 宏可能出错
inline int square(int x) { return x * x; } // ✅ 更安全
✅ inline
解决宏的副作用
std::cout << SQUARE(5 + 1); // ❌ 结果错误 `5 + 1 * 5 + 1 = 11`
std::cout << square(5 + 1); // ✅ 结果正确 `(5 + 1) * (5 + 1) = 36`
📌 inline
遵守类型安全规则,而 #define
可能导致计算错误!
7. inline
关键总结
特点 | inline 函数 | 普通函数 |
---|---|---|
是否展开 | ✅ 可能被编译器展开 | ❌ 必须执行 CALL 指令 |
适用场景 | ✅ 小函数,频繁调用 | ✅ 大函数,递归 |
是否占用额外栈空间 | ❌ 不会占用 | ✅ 会占用 |
支持虚函数 | ❌ 不支持 | ✅ 支持 |
🚀 C++ 代码优化推荐 inline
用于小型函数,避免不必要的函数调用开销! 🚀