Go语言的逃逸分析是怎么进行的

   💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。



非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
 

前言

小郑最近在准备Go语言的面试题,通过github和b站等各种学习网站上学习go语言的八股文,并且整理出自己觉得面试可能会问到的知识点,希望通过做笔记的方式来巩固自己的知识点,并且也希望可以帮助到大家在面试的时候更加得心应手一些,那么从现在开始,和我一起加入八股学习之旅吧!

回答重点

逃逸分析是编译器优化的一部分,用来决定对象应该分配在栈上还是堆上。

在 Go 语言中,编译器会在编译期间进行逃逸分析,通过分析代码中的变量确定它们是否会“逃逸”出当前的作用域。

如果一个变量在函数或方法内被创建,但在函数外部仍然被引用,那么它将被称为“逃逸”,需要分配到堆上;否则,它将被分配在栈上。

栈分配和堆分配的区别:

栈分配的好处是分配和释放内存的开销非常小,速度快。

堆分配需要依赖垃圾回收器(GC)来管理内存,因此开销相对较大。

逃逸分析的过程

逃逸分析由编译器在编译期间进行,它检查每一个变量的使用情况。编译器根据变量的作用范围、生命周期、以及变量是否被传递给其他协程或返回到外部等来确定其是否逃逸。

主要的原则包括:

  • 若变量的生命周期超出当前函数,则视为逃逸。
  • 若变量被引用并存储到堆上,则视为逃逸。

变量本来应该存在栈上(即是局部的,生命周期只在当前函数内),但是它被引用到堆上,意味着它的生命周期会超出当前函数的作用域,可能会继续存在下去。这就发生了“逃逸”。

  • 若变量被传递给外部函数、方法或 goroutine,且存活时间可能超过当前函数,则视为逃逸。

package mainimport "fmt"func escapeExample() *int {x := 42       // 局部变量 xreturn &x     // 返回 x 的地址,x 发生逃逸,分配到堆上
}func stackExample() int {x := 42       // 局部变量 xreturn x      // x 没有逃逸,分配在栈上
}

由于 Go 语言的内存模型,如果你将一个局部变量的地址返回,这个变量的生命周期就会被延长。

Go 编译器会认为 x 的生命周期不能仅限于函数 escapeExample 的作用域,因为返回的地址可能会在函数外部被引用。因此,Go 会把 x 从栈上移动到堆上,并确保它的生命周期持续足够长。

return x 返回了 x 的值,而不是返回 x 的地址。 在这种情况下,x 的值被复制到了调用者的栈上,这意味着 x 并没有逃逸到堆上。它依然只在函数内部有效,并且在函数调用结束后会被销毁。

逃逸分析的优化技巧

返回指针,闭包捕获,接口赋值,动态类型转换等会导致变量逃逸。

1,避免不必要的指针返回:如果可能,返回值而不是返回指针。

2,减少闭包对变量的引用:避免在闭包中使用外部变量,尽量将变量传递给闭包。

3,游免接口赋值:使用具体类型代营接口,减少逃逸到堆的可能性。

❤️❤️❤️小郑是普通学生水平,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM 芯片上移植 Ubuntu 操作系统详细步骤

一、准备工作 (一)硬件准备 ARM 开发板:确保 ARM 开发板的型号与 Ubuntu 官方支持的 ARM 架构兼容,常见的 ARM 架构有 ARMv7、ARMv8 等。例如树莓派系列开发板,广泛用于 ARM 系统移植,其采用 ARM 架构。存…

两台服务器之前共享文件夹

本文环境 服务器A:ubuntu24.22系统 IP:10.0.8.1 服务器B:ubuntu24.22系统 IP:10.0.8.10 本操作旨在将服务器B的/opt/files目录共享给服务器A得/opt/files 在 B 服务器上设置共享 安装 NFS 服务: sudo apt -y install nfs-kernel-server编辑/etc/exports文件&…

超市销售管理系统 - 需求分析阶段报告

1. 系统概述 超市销售管理系统是为中小型超市设计的信息化管理解决方案,旨在通过信息化手段实现商品管理、销售处理、库存管理、会员管理等核心业务流程的数字化,提高超市运营效率和服务质量,同时为管理者提供决策支持数据。 2. 业务需求分…

GPIO控制

GPIO是General Purpose I/O的缩写,即通用输入输出端口,简单来说就是MCU/CPU可控制的引脚, 这些引脚通常有多种功能,最基本的是高低电平输入检测和输出,部分引脚还会与主控器的片上外设绑定, 如作为串口、I2…

Docker 部署Nexus仓库 搭建Maven私服仓库 公司内部仓库

介绍 Nexus 是广泛使用的仓库管理工具,常用于管理 Java 构件(如 JAR、WAR、EAR 文件)。它可以作为一个本地的 Maven 仓库,用来存储和管理项目的依赖包和构建产物。支持多种仓库类型,能够帮助开发团队更高效地管理构件…

Android 13 默认打开 使用屏幕键盘

原生设置里,系统-语言和输入法-实体键盘-使用屏幕键盘 选项, 关闭时,外接物理键盘,如USB键盘,输入时不会弹出软键盘。 打开时,外接物理键盘,如USB键盘,输入时会弹出软键盘。 这个选…

关于ubuntu下交叉编译arrch64下的gtsam报错问题,boost中boost_regex.so中连接libicui18n.so.55报错的问题

交叉编译gtsam时遇到的报错信息如下:gtsam需要连接boost, 解决办法: 1.重新编译boost可解决。 2.自己搞定生成一个libicui18n.so.55。 由于我们的boost是公用的,因此1不太可能(我试过重新编译完boost,在编译gtsam完…

android-ndk开发(9): undefined reference to `__aarch64_ldadd4_acq_rel` 报错分析

1. 概要 基础库 libbase.a 基于 android ndk r18b 编译, 被算法库 libfoo.so 和算法库 libbar.a 依赖, 算法库则分别被 libapp1.so 和 libapp2.so 依赖。 libapp1.so 的开发者向 libfoo.so 的开发者反馈了链接报错: error: undefined symb…

如何清除windows 远程桌面连接的IP记录

问题 在远程桌面连接后,会在输入列表留下历史IP记录,无用的IP多了会影响我们查找效率,也不安全。 现介绍如何手动删除这些IP记录。 解决方案 1、打开注册表 按 Win R,输入 regedit,回车定位到远程桌面记录的注册表…

使用 React Native实现鸿蒙开发的详细方案

一、环境准备 1. 基础环境要求 操作系统:Windows 10/11 或 macOS (建议版本最新)Node.js: v16.x 或更高版本npm: v8.x 或更高版本Java JDK: 11 或更高版本DevEco Studio: 3.1 或更高版本 (鸿蒙官方IDE)2. 安装 DevEco Studio 从华为开发者官网下载安装时选择以下组件: Harmo…

贪心算法应用:顶点覆盖问题详解

贪心算法应用:顶点覆盖问题详解 贪心算法是解决顶点覆盖问题的经典方法之一。下面我将从基础概念到高级优化,全面详细地讲解顶点覆盖问题及其贪心算法解决方案。 一、顶点覆盖问题基础 1. 问题定义 顶点覆盖问题(Vertex Cover Problem&am…

Excel安全防护:开源批量加密工具推荐与使用指南

先放下载链接:https://tool.nineya.com/s/1iqsn2sh0 在日常办公里,像财务数据、客户信息、项目报表这类核心资料,常常是以 Excel 文件的形式来存储的。要是手动一个一个地给这些文件加密,那可太费时间和精力了,而且还…

【C++】学习、项目时Debug总结

这里写目录标题 1. 内存问题1.1. 内存泄漏1.1.1. 内存泄漏案例检查方法1.1.2. 主线程提前退出导致【控】1.1.3. PostThreadMessage失败导致的内存泄漏**【控】**1.1.4. SendMessage 时关闭客户端【控】1.1.5. 线程机制导致【**控】**1.1.6. exit(0)导致【…

2025 后端自学UNIAPP【项目实战:旅游项目】1、创建项目框架

1、创建项目 ①项目名称:自定义,【我是travel】 ②vue版本:vue3 ③其他默认,最后创建 2、创建页面 ①展开自己刚才创建的项目 ②单击选中pages文件夹 --->鼠标右键---->新建页面 ③页面名称:自定义favouri…

WPF 子界面修改后通知到主页面

子页面: public partial class MyPopupWindow : Window { public event Action OnClose; private void CloseWindowButton_Click(object sender, RoutedEventArgs e) { OnClose?.Invoke(); this.Close(); } } 主界面&#xff1a…

Python中的标识、相等性与别名:深入理解对象引用机制

在Python编程中,理解变量如何引用对象以及对象之间的比较方式是至关重要的基础概念。本文将通过Lewis Carroll的笔名示例,深入探讨Python中的对象标识、相等性判断以及别名机制。 别名现象:变量共享同一对象 >>> charles {name: …

python 闭包获取循环数据经典 bug

问题代码 def create_functions():functions []for i in range(3):# 创建一个函数,期望捕获当前循环的i值functions.append(lambda: print(f"My value is: {i}"))return functions# 创建三个函数 f0, f1, f2 create_functions()# 调用这些函数 f0() # 期望输出 &…

克里金模型+多目标优化+多属性决策!Kriging+NSGAII+熵权TOPSIS!

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 克里金模型多目标优化多属性决策!KrigingNSGAII熵权TOPSIS!!matlab2023b语言运行! 1.克里金模型(Kriging Model)是一种基于空间统计学的插值方法…

Prompt Engineering 提示词工程学习

一、Prompt Engineering 简介 Prompt Engineering 是设计和优化输入提示(Prompt)以获得预期输出的过程。在与大型语言模型(如 GPT-4)交互时,如何构造提示会显著影响模型的回答质量。 二、Prompt 的重要性 提高生成准确性:通过正确的 Prompt 引导,模型能够更好地理解用…

MATLAB安装常见问题及解决方案详解(含代码示例)

MATLAB作为科学计算和工程分析的核心工具,其安装过程可能因操作系统版本、硬件配置或网络环境等因素而出现各种问题。本文基于MATLAB官方文档和社区经验,系统总结了安装过程中常见的问题,并提供详细的解决方案和代码示例,帮助用户…