news 2026/4/16 19:59:56

关于内联函数的理解学习

作者头像

张小明

前端开发工程师

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/4/15 12:25:49

我发现FedProx破解联邦学习数据偏移,基层糖尿病筛查F1值暴涨9%

&#x1f4dd; 博客主页&#xff1a;Jax的CSDN主页 目录医生&#xff0c;你今天的AI有点上头 01. 当AI成为我的"病友" 02. 误诊界的"薛定谔的猫" 03. 冷笑话时间 04. 代码块里的bug 05. 2026年的医疗预言 06. 给AI画条红线 07. 给同行的建议 08. 最后... …

作者头像 李华
网站建设 2026/4/16 10:13:35

无需 MediaCreationTool!微软官网直下 Win10 最新 ISO 镜像,超简单教程

想重装 Win10 系统&#xff0c;却被微软官网强制要求下载 MediaCreationTool 工具搞得头大&#xff1f;不少用户吐槽这个工具不仅占用额外存储空间&#xff0c;还可能出现下载失败、兼容性报错等问题&#xff0c;尤其对追求高效的用户来说&#xff0c;“多此一举” 的操作实在影…

作者头像 李华
网站建设 2026/4/16 10:13:51

AFFiNE开发环境搭建实用指南:从问题到解决方案的完整流程

AFFiNE开发环境搭建实用指南&#xff1a;从问题到解决方案的完整流程 【免费下载链接】AFFiNE AFFiNE 是一个开源、一体化的工作区和操作系统&#xff0c;适用于组装您的知识库等的所有构建块 - 维基、知识管理、演示和数字资产。它是 Notion 和 Miro 的更好替代品。 项目地址…

作者头像 李华
网站建设 2026/4/16 10:13:32

GitNext:OpenHarmony专属Git客户端完整使用指南

GitNext&#xff1a;OpenHarmony专属Git客户端完整使用指南 【免费下载链接】GitNext 基于可以运行在OpenHarmony的git&#xff0c;提供git客户端操作能力 项目地址: https://gitcode.com/OpenHarmonyPCDeveloper/GitNext 作为OpenHarmony系统上首个原生Git客户端&#…

作者头像 李华
网站建设 2026/4/15 16:37:52

护航“大国重器”:北京银行助力船舶企业“破浪出海”

东南沿海的枢纽港湾带中&#xff0c;焊花闪烁&#xff0c;机器轰鸣。一艘艘标志着中国制造新高度的船舶完成最后调试&#xff0c;即将启程远航&#xff0c;驶向美国、德国、意大利、希腊等全球各大港口。在这幅“大国重器”扬帆出海的壮阔图景背后&#xff0c;北京银行南京分行…

作者头像 李华