133.为什么不能把所有的函数写成内联函数?

133.为什么不能把所有的函数写成内联函数?

内联是用 “空间换时间”,滥用会导致代码体积爆炸,反而更慢,还会带来其他问题。

1. 代码膨胀(最主要原因)

内联函数会在每一个调用的地方直接展开,不产生函数调用。

如果一个函数被调用 1000 次,就会插入 1000 份副本。

  • 函数越多、越复杂 → 可执行文件急剧变大
  • 代码太大无法全部放进 CPU 缓存 → 缓存命中率下降 → 程序反而更慢

2. 编译器不一定听你的

inline 只是建议,不是命令。

  • 函数复杂(循环、递归、大量语句)
  • 虚函数、递归函数编译器会自动拒绝内联,写了也白写。

3. 递归函数无法内联

内联要求编译期直接展开,

递归不知道要展开多少层,根本无法展开

4. 虚函数一般不能内联

虚函数是运行时多态,调用哪个要运行时才确定,

编译期无法直接展开,所以内联无效。

5. 函数指针调用无法内联

如果用函数指针调用,编译器不知道指向哪个函数,

无法在编译期展开。

6. 调试困难

内联函数在目标代码中没有独立地址

调试时无法打断点、无法单步进入,bug 难定位。

适合内联的只有这类函数

  • 函数体非常短小(几行)
  • 调用非常频繁
  • 没有循环、递归、复杂逻辑

最终一句话总结(背这个)

内联会造成代码膨胀、降低缓存效率,且递归、虚函数、复杂函数无法内联;同时会导致调试困难,因此不能所有函数都内联。

posted @ 2023-08-02 21:41  CodeMagicianT  阅读(101)  评论(0)    收藏  举报