news 2026/3/20 20:49:17

16. 普通函数调用开销

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
16. 普通函数调用开销

1.普通函数调用开销

2.内联函数


1.普通函数调用开销

普通函数调用不是"直接执行函数代码",而是需要先做"准备工作",执行完毕后还要做"收尾工作",再加上指令跳转的损耗 这三部分共同构成了调用专属开销("这部分开销和函数体本身的业务逻辑执行无关, 是调用动作带来的额外损耗")
1).压栈开销(调用前的准备工作)程序执行时,有一块专门的内存区域叫"调用栈",每个函数调用都会在调用栈上创建一个独立的栈帧;调用函数前,CPU必须 执行额外指令,把两件东西放进这个栈帧里:a.函数的参数值:比如调用Add(3,5),要先把35压入栈帧,这样函数体内部才能读取到这两个参数 b.返回地址:就是"当前代码执行到调用函数的下一行指令地址";比如:Main函数里第10行调用Add,返回地址就是第11,压入栈帧是为了函数执行完后,知道该回到哪里继续执行 这部分"压入数据"的指令执行,就是压栈开销(额外的CPU运算和内存操作)
2).弹栈开销(调用后的收尾工作)函数执行完毕后(比如:Add计算出结果8),不能直接结束,还要做收尾,这就是弹栈开销 a.从栈帧中取出之前压入的返回地址,让CPU跳转到这个地址(回到调用函数的下一行继续执行)b.释放当前函数的栈帧(把栈帧里的参数、返回地址等数据清除,回收栈内存空间),避免内存泄漏 这两步同样需要执行额外的CPU指令,构成弹栈开销
3).CPU指令跳转开销 普通函数调用时,CPU的执行流程是中断式的,不是连续的 原本CPU在按顺序执行Main函数的指令(1行 → 第2行→…→ 第10),到第10行调用Add函数时,CPU需要暂停Main函数的执行 跳转到Add函数体的起始指令地址去执行;Add函数执行完后,又要再次跳转(根据返回地址)回Main函数的第11,这种指令地 址的跳转”会带来额外损耗;比如CPU的"指令流水线"(提前预取指令提高效率)会被清空,需要重新填充,这就是跳转开销

2.内联函数

内联函数是在编译优化阶段,直接把被调用函数的完整函数体代码,"复制粘贴"到调用它的位置,替换掉原来的函数调用语 句;简单说:原来的"调用函数→压栈→跳转→弹栈→返回"的流程,被直接替换为"原地执行函数体代码",没有了调用”这个动作 压栈、弹栈、指令跳转这些开销自然就彻底消失
1).普通函数调用(有开销)

普通调用的执行流程:Main 第1(调用 Add)→ 压栈(35、Main 第2行地址)→ 跳转至Add函数体 → 执行a+b →弹栈(取返回地址)→ 跳转回Main第2行 → 执行 Console.WriteLine

2).内联优化后(无调用开销)

内联后的执行流程:Main第1(直接执行3+5)→ Main 第2(执行 Console.WriteLine),全程没有压栈、弹栈、指令跳转 彻底消除了调用开销
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/18 15:56:06

【鸿蒙开发实战】HarmonyOS网络请求简化示例

使用说明创建文件:在 entry/src/main/ets/pages/ 目录下创建 NetworkDemo.ets或者直接替换现有页面的代码配置权限:在 module.json5 中添加网络权限(如上所示)运行应用:点击"测试GET请求"按钮发送HTTP请求点…

作者头像 李华
网站建设 2026/3/17 17:46:49

3、软件设计模式与架构解析

软件设计模式与架构解析 1. 变更控制 在遵循严格文档原则的系统中,通常不允许频繁更改需求。过去,这常常导致“范围蔓延”现象,即项目从一个简单的设计开始,最终却变得极其复杂,严重超出预算和时间。例如,原本只是设计一个简单的电灯开关,最后却变成了一个运行的核电站…

作者头像 李华
网站建设 2026/3/19 21:46:17

ArduPilot飞控搭配BLHeli电调的航拍稳定性优化指南

让航拍稳如磐石:ArduPilot飞控与BLHeli电调的深度协同实战你有没有遇到过这种情况——精心架设云台、用上6K相机,飞行器一起飞,画面却总是“微微晃动”,像是镜头在“呼吸”?明明悬停很稳,回放视频时却总觉得…

作者头像 李华
网站建设 2026/3/18 7:58:54

现网都在用,但很多人不知道的网络服务和管理

一、DHCP 动态主机配置协议核心概念协议层级应用层协议核心作用客户端网卡设置为「动态获取IP」模式时,DHCP服务器会自动为其分配IP地址、子网掩码、网关、DNS等网络参数,实现客户端联网,减少手动配置工作量。典型场景办公网、校园网、家庭路…

作者头像 李华
网站建设 2026/3/20 8:14:22

基于Dify的语音助手前端+后端整合方案

基于 Dify 的语音助手前后端整合实践 在智能设备无处不在的今天,用户对“能听、会说、懂你”的语音助手期待越来越高。从智能家居到企业客服系统,语音交互正逐步成为主流入口。但构建一个真正可用的语音助手,并非只是接上语音识别&#xff08…

作者头像 李华
网站建设 2026/3/19 15:05:33

LVGL教程:RGB接口屏幕驱动调试技巧

搞定RGB屏不花、不闪、不撕裂:LVGL底层驱动调试实战指南你有没有遇到过这样的场景?LVGL界面写得漂亮,控件动画丝滑流畅,结果一烧进板子——屏幕要么全白、要么花得像抽象画,或者画面“上下错位”、刷新时疯狂闪烁。更糟…

作者头像 李华