inline vs. 宏

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)普通函数的调用

普通函数调用涉及:

  1. 压栈(Push arguments)
  2. 跳转到函数地址
  3. 执行函数
  4. 返回值
  5. 恢复栈帧
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 用于小型函数,避免不必要的函数调用开销! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值