当前位置: 首页 > news >正文

3.1 Go函数调用过程

在 Go 语言中,函数调用的核心机制依赖于内存的栈区分配和指针操作,理解这一原理有助于掌握函数的执行过程。

1. 内存结构概述

在 Go 程序编译成可执行文件并启动后,操作系统会为其分配进程内存,进程内存主要分为以下区域:

栈(Stack):用于函数调用的临时数据存储(如局部变量、函数参数等)。

堆(Heap):用于动态内存分配,数据可以在多个函数间共享。

代码区:存储程序的可执行指令。

全局区:存放全局变量和常量。

一旦进程结束,这些内存区域会被操作系统回收。

2. 栈与函数调用

栈是 Go 函数调用的基础,每次函数调用都会在栈中创建一个 栈帧 (Stack Frame)。栈帧用于存储该次调用的局部变量、参数和返回地址。函数调用结束时,栈帧会被回收。

栈的特点:

1. 先进后出 (LIFO):后调用的函数先完成返回。

2. 连续性:栈内存是连续的,按顺序分配内存。

3. 有限性:栈空间可以动态增长,但有限制,防止无限递归导致栈溢出。

栈帧 (Frame)

栈帧是函数调用的核心单元,包含以下内容:

返回地址:记录调用函数的下一条指令地址,以便返回后继续执行。

函数参数:用于传递调用方传入的参数。

局部变量:在栈帧中存储函数内部定义的变量。

现场保护:保存调用方的状态(如寄存器内容),以便函数返回时恢复现场。

3. 函数调用过程

以下以 main 函数调用 add 函数为例,详解函数调用的流程:

func add(x, y int) int {r := x + y  // 计算结果存储在局部变量 r 中return r    // 返回值,清理栈帧
}func main() {a, b := add(10, 20)  // 调用 add 函数fmt.Println(a, b)t := add(a, b)       // 再次调用 addfmt.Println(t)
}

调用过程详解:

1.现场保护:在调用 add 函数前,main 函数会保存当前的执行现场,包括:

  • 指令指针 (Instruction Pointer, IP):记录 main 函数的下一条指令地址。
  • 栈顶指针 (Stack Pointer, SP):记录栈的当前状态。

2.参数传递:将调用方 (main) 的参数 10 和 20 压入栈中。

3.跳转执行:IP 指针跳转到 add 函数的起始地址,add 函数开始执行。

4.栈帧分配:为 add 函数分配栈帧,用于存储参数 x、y 和局部变量 r。

5.计算与返回

  • add 函数计算 x + y 的结果,将其存储在 r 中。
  • 函数结束时,将返回值写入调用方的栈帧,清理自己的栈帧。

6. 恢复现场:从栈中取出 main 函数的现场信息,恢复 IP 指针,使程序继续执行 fmt.Println(a, b)。

4. 栈帧结构

栈帧在内存中的布局如下:

|-------------------------|

| 返回地址 (Return Addr) |

|-------------------------|

| 参数 x, y |

|-------------------------|

| 局部变量 r |

|-------------------------|

栈顶指针 (SP):指向当前栈帧的顶部。

• 栈基指针 (BP):指向当前栈帧的底部。

• 栈帧大小:SP - BP。

5. 指令指针与恢复

Go 的函数调用依赖于指令指针 (Instruction Pointer, IP) 和栈指针 (Stack Pointer, SP) 的协调:

  • 现场保护:在调用 add 时,main 的 IP 会被保存,指向 add 返回后的指令地址。
  • 现场恢复:add 执行结束时,IP 被重写为 main 的下一条指令地址,从而恢复 main 的执行。

6. 函数的独立性

每次函数调用都是独立的,其栈帧互不影响。以以下代码为例:

t := add(10, 20)  // 栈中为本次 add 分配新的栈帧
t = add(a, b)     // 旧栈帧被回收,重新分配新的栈帧

7. 总结

  • Go 的函数调用基于栈区,利用栈帧进行参数传递、变量存储和返回值保存。
  • 指令指针 (IP) 与栈指针 (SP) 协同工作,实现函数的跳转与现场恢复。
  • 栈帧的分配与回收确保函数调用的独立性与安全性。

相关文章:

3.1 Go函数调用过程

在 Go 语言中,函数调用的核心机制依赖于内存的栈区分配和指针操作,理解这一原理有助于掌握函数的执行过程。 1. 内存结构概述 在 Go 程序编译成可执行文件并启动后,操作系统会为其分配进程内存,进程内存主要分为以下区域&#x…...

TDengine 做 Apache SuperSet 数据源

‌Apache Superset‌ 是一个现代的企业级商业智能(BI)Web 应用程序,主要用于数据探索和可视化。它由 Apache 软件基金会支持,是一个开源项目,它拥有活跃的社区和丰富的生态系统。Apache Superset 提供了直观的用户界面…...

08_游戏启动逻辑

1.GameRoot.cs 控制 服务层Svc.cs 和业务层Sys.cs 的初始化 创建脚本GameRoot.cs(游戏入口 已进入就初始化各个系统) 创建资源加载服务.cs Res 将服务层Svc设置成单例类所以需要挂载在GameRoot身上,这样就可以通过GameRoot来调各个服务 接…...

Ardupilot开源无人机之Geek SDK进展2024-2025

Ardupilot开源无人机之Geek SDK进展2024-2025 1. 源由2. 状态3. TODO3.1 【进行中】跟踪目标框3.2 【暂停】onnxruntime版本3.3 【完成】CUDA 11.8版本3.4 【完成】pytorch v2.5.1版本3.5 【未开始】Inference性能3.6 【未开始】特定目标集Training 4. Extra-Work4.1 【完成】C…...

在K8S中,如果后端NFS存储的IP发送变化如何解决?

在Kubernetes中,如果后端NFS存储的IP地址发生了变化,您需要更新与之相关的Peristent Volume(PV)或Persistent Volume Claim(PVC)以及StorageClass中关于NFS服务器IP的配置信息,确保K8S集群内的Pod能够正确连接到新的NFS存储位置。解决方案如下…...

模拟飞行入坑(五) P3D 多通道视角配置 viewgroup

背景: P3D进行多个屏幕显示的时候,如果使用英伟达自带的屏幕融合成一个屏,或者使用P3D单独拉伸窗口,会使得P3D的画面被整体拉伸,又或者,当使用Multichannel进行多个设备联动时,视角同步组合需要配置&#…...

【springboot集成knife4j】

SpringBoot集成knife4j Knife4j是为Java MVC框架集成Swagger生成API文档的一套增强解决方案,它基于Swagger原有的基础上进行了一些改进和增强,提供了更简洁的UI界面,同时支持更多的自用化配置。下面是在Spring Boot项目中集成Knife4j的基本步…...

GPUStack使用

1. 概述 官网:https://github.com/gpustack Open-source GPU cluster manager for running large language models(LLMs) https://github.com/gpustack/gpustack,Manage GPU clusters for running AI models GPUStack 是一个用于运行 AI 模型的开源 GPU 集群管理器。 官…...

如何选择一款助贷获客系统?

做助贷的销售们,一天打几百个电话,跑各种新媒体平台评论区偷流量,每天忙得昏天黑地,也没有多少客户。没有精准数据,助贷销售着急,公司也着急,每天让员工加班找客户,但是巧妇难为无米…...

GDB相比IDE有什么优点

GDB(GNU Debugger)相比于集成开发环境(IDE)具有一些独特的优点,主要体现在其灵活性、可定制性和低级控制能力。具体来说,GDB有以下几个优点: 1. 轻量级且无依赖 GDB是一个命令行工具,不依赖于任何复杂的图形界面或大型库,这使得它非常适合在资源受限的环境中使用,比…...

介绍用于机器学习的 Fashion-MNIST 数据集

介绍用于机器学习的 Fashion-MNIST 数据集 为什么要研究数据集? 让我们首先思考一下为什么要花时间研究数据集的问题。数据是深度学习的主要成分,虽然作为神经网络程序员的任务是让我们的神经网络从我们的数据中学习,但我们仍然有责任了解我…...

【GitHub】登录时的2FA验证

一、如何进行2FA认证 1.在你的浏览器中下载 Authenticator身份验证插件 2.使用身份验证器添加凭证 2.1 使用身份验证器扫描验证二维码 选择扫描二维码...

CSDN年度回顾:技术征途上的坚实步伐

嘿,时光过得可真快呀,就像那匹跑得飞快的白马,嗖的一下,2024 年的日历就这么悄无声息地翻到了最后一页。这会儿我回头看看在 CSDN 上度过的这一年,心里那叫一个感慨万千,满满的都是喜悦,就像心里…...

Kotlin Bytedeco OpenCV 图像图像57 图像ROI

Kotlin Bytedeco OpenCV 图像图像57 图像ROI 1 添加依赖2 测试代码3 测试结果 1 添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns"http://maven.apache.o…...

支持大功率输出高速频闪的图像处理用光源控制器

机器视觉系统中的光源控制器在确保图像质量、提高系统稳定性、降低能耗以及方便系统扩展和升级等方面发挥着重要作用。它可提供稳定光源&#xff0c;调节参数&#xff0c;另外具有操作便捷性。 下面我们来看Gardasoft的光源控制器&#xff0c;Gardasoft拥有作为图像处理用LED光…...

《从入门到精通:蓝桥杯编程大赛知识点全攻略》(五)-数的三次方根、机器人跳跃问题、四平方和

本博客将详细探讨如何通过二分查找算法来解决这几个经典问题。通过几个实际的例子&#xff0c;我们将展示如何在这些问题中灵活应用二分查找&#xff0c;优化计算过程&#xff0c;并在面对大数据量时保持高效性。 目录 前言 数的三次方根 算法思路 代码如下 机器人跳跃问题…...

Java-数据结构-二叉树习题(2)

第一题、平衡二叉树 ① 暴力求解法 &#x1f4da; 思路提示&#xff1a; 该题要求我们判断给定的二叉树是否为"平衡二叉树"。 平衡二叉树指&#xff1a;该树所有节点的左右子树的高度相差不超过 1。 也就是说需要我们会求二叉树的高&#xff0c;并且要对节点内所…...

解锁面向对象编程:Python 类与对象详解

&#x1f3e0;大家好&#xff0c;我是Yui_&#x1f4ac; &#x1f351;如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f680;如有不懂&#xff0c;可以随时向我提问&#xff0c;我会全力讲解~ &#x1f52…...

国产编辑器EverEdit -重复行

1 重复行 1.1 应用场景 在代码或文本编辑过程中&#xff0c; 经常需要快速复制当前行&#xff0c;比如&#xff0c;给对象的多个属性进行赋值。传统的做法是&#xff1a;选中行-> 复制-> 插入新行-> 粘贴&#xff0c;该操作有4个步骤&#xff0c;非常繁琐。 那有没…...

记一次数据库连接 bug

整个的报错如下&#xff1a; com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Metho…...

云边协同 智启未来 | 阿里云 × ZStack 云边一体解决方案正式落地

随着数字化转型的不断深入&#xff0c;企业对于云计算的需求已从"集中上云"逐步演进为"云边协同"。在智慧城市、工业互联网、智慧交通、能源电力等行业场景中&#xff0c;数据的实时处理、低延迟响应以及本地化合规需求日益迫切。单一的中心化云架构已难以…...

低资源场景下的效果:nlp_structbert_sentence-similarity_chinese-large 小样本学习能力展示

低资源场景下的效果&#xff1a;nlp_structbert_sentence-similarity_chinese-large 小样本学习能力展示 最近在做一个垂直领域的智能客服项目&#xff0c;客户给的标注数据少得可怜&#xff0c;满打满算也就几十对对话样本。团队里有人犯愁&#xff0c;觉得这点数据连模型热身…...

GLM-4.6V-Flash-WEB效果展示:智能识别华硕/戴尔/联想BIOS界面

GLM-4.6V-Flash-WEB效果展示&#xff1a;智能识别华硕/戴尔/联想BIOS界面 1. 引言&#xff1a;BIOS界面识别的技术挑战 面对不同品牌电脑的BIOS设置界面&#xff0c;即使是经验丰富的技术人员也常常感到头疼。华硕的UEFI界面、戴尔的BIOS配置、联想的设置菜单——每个厂商都有…...

面试现场的“AI 对话感”:为什么 2026 年的面试官更喜欢“像跟 AI Pair Programming”一样的沟通节奏?

在 2026 年的北美科技大厂面试中&#xff0c;随着智能代码助手的全面普及&#xff0c;资深工程师们的日常工作习惯已经被彻底重塑。他们每天有大量的时间是在与极其高效、结构化的大语言模型进行 Pair Programming&#xff08;结对编程&#xff09;。这种潜移默化的习惯改变&am…...

2026年SCI论文AI率要求5%以下?这3款降AI工具期刊场景亲测

投了一篇SCI二区&#xff0c;被审稿人指出AI率超标&#xff0c;编辑直接打回来要求修改。那是去年的事&#xff0c;折腾了我快两个月。 事情的起因很简单&#xff1a;我用DeepSeek辅助写了大量段落&#xff0c;初稿AI率检测下来68%&#xff0c;远超期刊要求的10%以下。降下去的…...

SEO网络推广和SEM(搜索引擎营销)有什么不同

SEO网络推广和SEM(搜索引擎营销)有什么不同 在当今的数字营销世界中&#xff0c;SEO网络推广和SEM(搜索引擎营销)是两种非常重要的策略&#xff0c;它们都有助于提高网站的可见性和流量。它们在方法、成本、效果等方面有着显著的不同。本文将详细探讨SEO和SEM的差异&#xff0…...

04.Python 循环:while+for详解

1. 循环 while或 for后边都记得加:&#xff08;英文冒号&#xff09; 1.1 while 1.1.1 概述 ① 初始化计数器 ② 编写循环条件&#xff08;判断计数器是否达到了目标位置&#xff09; ③ 在循环内部更新计数器 1.1.2 猜数字案例 #适用于 循环次数未知的情况, 例如: 猜数字游戏.…...

**发散创新:基于Rust的轻量级权限管理库设计与开源许可证实践**在现代分布式

发散创新&#xff1a;基于Rust的轻量级权限管理库设计与开源许可证实践 在现代分布—...

全流程效率提升:Scarab开源模组管理器的跨平台解决方案

全流程效率提升&#xff1a;Scarab开源模组管理器的跨平台解决方案 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 当你兴致勃勃地想为《空洞骑士》安装模组时&#xff0c;是否…...

别再瞎调参了!HuggingFace Trainer微调BERT/ViT的保姆级避坑指南(附ArcFace实战代码)

HuggingFace Trainer微调实战&#xff1a;从参数陷阱到模型优化的深度拆解 当你第5次看到验证集准确率在0.85附近震荡不前&#xff0c;而训练损失仍在持续下降时&#xff0c;是否开始怀疑自己选择的优化器、学习率或损失函数&#xff1f;这不是个例——超过60%的NLP工程师在使用…...