news 2026/6/23 17:03:11

关于内联函数的理解学习

作者头像

张小明

前端开发工程师

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/23 1:21:19

Whisper部署实战手册:从环境配置到性能调优的完整解决方案

Whisper部署实战手册&#xff1a;从环境配置到性能调优的完整解决方案 【免费下载链接】Whisper High-performance GPGPU inference of OpenAIs Whisper automatic speech recognition (ASR) model 项目地址: https://gitcode.com/gh_mirrors/wh/Whisper 作为OpenAI Whi…

作者头像 李华
网站建设 2026/6/22 0:22:42

昇腾AI:不只是一颗芯片,更是一个时代的算力答案

在2025年世界人工智能大会的核心展区&#xff0c;一台被称为“镇馆之宝”的昇腾384超节点被参观者团团围住&#xff0c;金属机身泛着冷光&#xff0c;内部却跳动着创新算力架构的脉冲。智能时代的算力竞赛已进入白热化&#xff0c;当大部分目光聚焦于单颗芯片的算力比拼时&…

作者头像 李华
网站建设 2026/6/23 18:41:18

6、网络服务枚举与安全防护全解析

网络服务枚举与安全防护全解析 1. 基础横幅抓取 横幅抓取是最基本的枚举技术,通过连接远程应用并观察输出,攻击者可获取运行服务的品牌和型号等关键信息,为漏洞研究提供线索。常见的手动横幅抓取工具包括 telnet 和 netcat 。 - telnet :大多数操作系统内置的远…

作者头像 李华
网站建设 2026/6/21 17:24:35

8、Windows系统认证攻击与防范全解析

Windows系统认证攻击与防范全解析 在Windows系统的安全领域,一旦攻击者获得了一定程度的访问权限,后续往往会展开一系列更具威胁性的行动。本文将详细介绍攻击者在获得访问权限后可能采取的攻击手段,以及相应的防范措施。 1. 权限提升 攻击者获取Windows系统的用户账户后…

作者头像 李华
网站建设 2026/6/23 12:03:29

Linux网络参数:现代内核的智能优化之道

你是否曾经花费大量时间调整各种网络参数&#xff0c;却发现效果甚微&#xff1f;或者盲目跟随网上的调优指南&#xff0c;却导致系统稳定性问题&#xff1f;今天&#xff0c;让我们重新审视Linux网络参数的真正价值——现代内核已经内置了令人惊叹的智能优化机制。 【免费下载…

作者头像 李华
网站建设 2026/6/22 16:35:17

C# 随机数添加数组对象和数组的查询方法

一、数组对象添加数据使用随机数案例&#xff1a;定义一个数组&#xff0c;存储10个People对象&#xff08;姓名、性别、年龄&#xff09;要求年龄随机在18-30之间&#xff0c;性别也是随机的 姓名也是随机的首先声明一个带有&#xff08;姓名、性别、年龄&#xff09;属性的类…

作者头像 李华