news 2026/6/4 6:06:33

关于内联函数的理解学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
关于内联函数的理解学习

1.什么是内联函数:以空间换时间

编译器在编译阶段,会对内联函数进行语法分析和类型检查。如果确认安全且有性能收益,编译器会将函数体直接嵌入到调用处,就像把代码拷过去一样,但带有完整的类型安全机制。

2.内联函数如何减少调用开销

(1)我们先来看普通函数的调用,这涉及到栈帧操作:

  • 保存现场:把当前的寄存器值、返回地址压入栈。

  • 参数传递:把参数压入栈或放入寄存器。

  • 跳转:指令跳转到函数代码地址。

  • 执行:运行函数体。

  • 恢复现场:弹出栈,恢复寄存器,跳转回原来的位置。

(2)而内联函数,如果编译器决定执行内联(编译器也有可能不执行内联,即使你声明了,他会有一个开销判断),就会直接省略前几步,将第 4 步函数体本身插入在主流程中。

3.编译器具体是怎样优化内联函数的呢?

(1)替换

将目标函数体代码直接替换主函数的调用节点,并且用实参替换形参。这样一来,“函数调用”这个概念消失了,取而代之的是平铺直叙的指令序列。

(2)连锁优化:暴露上下文信息,让编译器能进行常量折叠、死代码消除等更高级的优化。

以下面这个代码为例:

// 简单的内联函数 inline int square(int x) { if (x < 0) return 0; // 假设负数返回0 return x * x; } void businessLogic() { int val = 10; int result = square(val); // 调用处 }

(1)代码展开: 编译器先把代码变成这样:

int val = 10; int result; if (val < 0) result = 0; else result = val * val;

(2)常量传播 (Constant Propagation): 编译器发现val10,是已知的常量。它会把10代入后续计算:

if (10 < 0) ... // 编译器发现 10 < 0 永远为 false else result = 10 * 10;

(3)死代码消除 (Dead Code Elimination): 既然10 < 0永远为假,那个if分支就是“死代码”,直接砍掉。

result = 10 * 10;

(4)常量折叠 (Constant Folding)10 * 10可以在编译期算出结果100

int result = 100;

4.并不是所有函数都可以内联

  • 函数体过大:如果函数有 100 行代码,内联 10 次,代码体积就膨胀 1000 行。这会导致最终的可执行文件变大,更糟糕的是会撑爆 CPU 的指令缓存,导致 Cache Miss 率飙升,反而变慢。

  • 递归函数:如果是无限递归,编译器没法内联(无法展开无穷次)。当

  • 虚函数:虚函数通常需要在运行时查表(虚函数表 )决定调用哪个,编译期不知道调用谁,所以很难内联。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/1 2:40:42

GC5035 CSP CMOS图像传感器终极指南:高性能移动摄像头解决方案

GC5035 CSP CMOS图像传感器终极指南&#xff1a;高性能移动摄像头解决方案 【免费下载链接】GC5035CSP图像传感器数据手册 GC5035 是一款高质量的 500 万像素 CMOS 图像传感器&#xff0c;专为移动电话摄像头应用和数码相机产品设计。GC5035 集成了一个 2592H x 1944V 像素阵列…

作者头像 李华
网站建设 2026/6/4 2:32:57

OpCore Simplify:告别复杂配置,一键生成完美黑苹果EFI

OpCore Simplify&#xff1a;告别复杂配置&#xff0c;一键生成完美黑苹果EFI 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为繁琐的黑苹果配置…

作者头像 李华
网站建设 2026/6/3 12:43:33

学术论文免费获取神器:3步安装Sci-Hub X Now扩展

学术论文免费获取神器&#xff1a;3步安装Sci-Hub X Now扩展 【免费下载链接】sci-hub-now 项目地址: https://gitcode.com/gh_mirrors/sc/sci-hub-now 还在为昂贵的学术论文发愁吗&#xff1f;今天为大家介绍一款能够彻底改变你学术研究方式的浏览器扩展——Sci-Hub X…

作者头像 李华
网站建设 2026/6/3 14:43:31

《从实验室到现场!PoE电源变压器的6大实战场景,工程师必看》

作为工程师&#xff0c;我们总在寻找“一根网线解决所有”的便捷方案&#xff0c;而PoE电源变压器正是这个方案的核心功臣。它让电力与数据通过同一根以太网线缆传输&#xff0c;既简化部署又降低成本&#xff0c;如今已从机房走向更广阔的实战场景&#xff0c;成为嵌入式开发、…

作者头像 李华
网站建设 2026/5/31 17:16:01

5大亮点解析:opus-mt-en-zh英语到中文翻译模型的独特优势

5大亮点解析&#xff1a;opus-mt-en-zh英语到中文翻译模型的独特优势 【免费下载链接】opus-mt-en-zh 项目地址: https://ai.gitcode.com/hf_mirrors/Helsinki-NLP/opus-mt-en-zh 在众多翻译模型中&#xff0c;opus-mt-en-zh作为一款专注于英语到中文翻译的开源模型&am…

作者头像 李华
网站建设 2026/6/1 3:27:29

存储器和寄存器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、存储器和寄存器1.存储器1.1常见的存储器介绍1.1RAM1&#xff09;SRAM2&#xff09;DRAM1.2ROM1&#xff09;MASK ROM2&#xff09;PROM3&#xff09;EPROM4&…

作者头像 李华