go语言面试一逃逸分析

一、逃逸分析

go语言中也会存在c++语言的内存泄漏和指针逃逸,所以go语言采用了逃逸分析来解决这种危险情况。

内存泄漏:如果使用C语言中的malloc动态分配内存,但却使用后忘记释放该内存,那么该内存就会发生泄漏,即原内存空间变小该内存不能被使用。

指针逃逸:把一个对象的指针被多个方法或者线程引用叫做这个指针发生了逃逸。

逃逸分析前提要知道栈和堆的概念。

:与数据结构中的栈相同却有不同,数据结构中的栈是一种数据存储了逻辑方式,这种方式要求先入后出。而操作系统的栈是指操作系统自动为程序分配的一部分内存,这部分内存用来存储局部变量或者保存函数调用栈。

:与栈相区别,堆是程序员自己向操作系统申请的一部分内存空间,用来满足其特别需要,程序员可以确定该内存的大小。

如果在一个函数内部创造一局部变量,又把该局部变量的指针作为返回值,那么程序会崩溃。因为局部变量在函数栈中,函数运行完毕会销毁其栈空间。如果把这个变量用new的方式创建则可以在函数返回后继续使用。因为变量是在堆内存中,函数运行后并不会销毁。

但是这块堆内存没有人保证它不会被忘记释放,即导致内存泄漏。为了解决内存泄漏的问题,很多语言都会采用一个GC的组件,用来回收一些没用的内存空间。

而逃逸分析就是尽量把内存分配到栈上,减少分配到堆上,减少GC压力,提高程序运行速度。

逃逸分析:根据判断变量在函数外是否被其他函数使用来确定把该变量分配到栈上还是堆上。若在函数外无使用,则分配到栈上,否则分配到堆上。

逃逸分析的补充:

  1. 如果定义很大数组,超过栈内存也会使用堆内存。
  2. 对于interface此类类型不确定的变量,也会发生逃逸。如fmt.Println(interface{})

对于go语言栈和堆的补充:

  • go语言也是应用程序,可以以自己编写的程序来理解,操作系统自动分配go语言的栈空间被要运行go语言的自身的组件所消耗如runtime、GC。而我们写go程序时所使用的栈和堆是go语言所创建堆空间的逻辑划分,这类思想在计算机中很常用。由此带来的好处是我们使用的栈很大,一般语言的栈1MB,而go程序的栈可以达到1GB
  • go语言为了防止栈的内存碎片化,会适当进行深拷贝,即把数据拷贝到另一处内存区域中。所以go语言一般不能指针运算。

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

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

相关文章

docker -v 和docker --device 有什么区别

1.docker -v 和docker --device的区别 区别在于docker -v是用来挂载宿主机文件系统的目录或文件到容器中,而docker --device是用来添加设备到容器中。 以docker -v /dev/ttyS0:/dev/ttyS0 和docker --device/dev/ttyS0:/dev/ttyS0的区别为例。 这两个命令都是用来将…

直方图与均衡化

直方图 统计图像中相同像素点的数量。 使用cv2.calcHist(images, channels, mask, histSize, ranges)函数 images:原图像图像格式为uint8或float32,当传入函数时应用[]括起来,例如[img]。 channels:同样用中括号括起来&#xff…

如何确保云中高可用?聊聊F5分布式云DNS负载均衡

在当今以应用为中心的动态化市场中,企业面临着越来越大的压力,不仅需要提供客户所期望的信息、服务和体验,而且要做到快速、可靠和安全。DNS是网络基础设施的重要组成部分,拥有一个可用的、智能的、安全和可扩展的DNS基础设施是至…

工程(十六)——自己数据集跑Fast_livo

一、基础环境 Ubuntu20.04 ROS noetic PCL 1.8 Eigen 3.3.4 Sophus git clone https://github.com/strasdat/Sophus.git cd Sophus git checkout a621ff mkdir build && cd build && cmake .. make sudo make install 下面两个直接把包下载下来一起编译…

2023-12-29 服务器开发-Centos部署LNMP环境

摘要: 2023-12-29 服务器开发-Centos部署LNMP环境 centos7.2搭建LNMP具体步骤 1.配置防火墙 CentOS 7.0以上的系统默认使用的是firewall作为防火墙, 关闭firewall: systemctl stop firewalld.service #停止firewall systemctl disable fire…

Windows上ModbusTCP模拟Master与Slave工具的使用

场景 Modbus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用: Modebus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用_modbus poll激活-CSDN博客 数据对接协议为Modbus TCP,本地开发需要使…

C语言编程入门 – 编写第一个Hello, world程序

C语言编程入门 – 编写第一个Hello, world程序 C Programming Entry - Write the first application called “Hello, world!” By JacksonML C语言编程很容易! 本文开始,将带领你走过C语言编程之旅,通过实例使你对她颇感兴趣,一…

GLTF编辑器实现逼真的石门模型

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 在凹凸贴图中,每个像素点都包含了一个法线向量&#xff0…

楼宇对讲门铃选型分析

目前很多的高层住宅都使用了对讲门铃了,在频繁使用中,门铃会出现的越来越多种类,下面我就简单的介绍会有用到的几款芯片. 语音通话芯片:D34018,D34118,D5020,D31101; D34018 单片电话机通话电路,合并了必 需的放大器…

带多版本管理的Ubuntu软件源服务器搭建

准备阶段 下载安装reprepro 注: 官方下载安装的reprepro是不支持多版本管理的, 因此 不要使用sudo apt install reprepro下载 源码网址 将三个文件放在同一个文件夹下, 例如repreproNew cd repreproNew # 安装所需依赖 sudo apt-get install build-essential debhelper sud…

Nature | 大型语言模型(LLM)能够发现和产生新知识吗?

大型语言模型(LLM)是基于大量数据进行预训练的超大型深度学习模型。底层转换器是一组神经网络,这些神经网络由具有自注意力功能的编码器和解码器组成。编码器和解码器从一系列文本中提取含义,并理解其中的单词和短语之间的关系。通…

GPT-3: Language Models are Few-Shot Learners

GPT-3 论文 数据集 CommonCrawl:文章通过高质量参考语料库对CommonCrawl数据集进行了过滤,并通过模糊去重对文档进行去重,且增加了高质量参考语料库以增加文本的多样性。WebText:文章采用了类似GPT-2中的WebText文档收集清洗方…

BUG-由浏览器缩放引起PC端显示手机端视图

文章目录 来源解决 来源 启动Vue项目,用浏览器打开显示手机端视图,从vscode直接ctrl链接打开正常显示。 检查-未开启仿真,但仍显示错误。 解决 浏览器缩放问题。 修改为100%

javascript实现数据双向绑定

ES5中的双向绑定 ES5中的对象属性类型有两种:分别是数据属性和访问器属性 一,数据属性 数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特性 1,configurable:表示能否通过delete删除属性而重新定义…

【机器学习前置知识】Beta分布

Beta分布与二项分布的关系 Beta分布与二项分布密切相关,由二项分布扩展而来,它是用来描述一个连续型随机变量出现的概率的概率密度分布,表示为 X X X~ B e t a ( a , b ) Beta(a,b) Beta(a,b) , a 、 b a、b a、b 是形状参数。Beta分布本质上也是一个概率密度函数,只是这…

nodeJS搭建免费代理IP池爬取贴吧图片实战

之前用python写过爬虫,这次想试试nodeJS爬虫爬取贴吧图片,话不多说代码如下,爬取制定吧的前十页所有帖子里的图片 爬取贴吧图片脚本 你得提前创建一个images文件夹 const axios require("axios"); const cheerio require("…

Python+Yolov5+Qt交通标志特征识别窗体界面相片视频摄像头

程序示例精选 PythonYolov5Qt交通标志特征识别窗体界面相片视频摄像头 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《PythonYolov5Qt交通标志特征识别窗体界面相片视频摄像头》编写代码&a…

[Angular] 笔记 19:路由参数

油管视频 Route Parameters 路由参数是跟在 url 后面的数字,字符串,或者 数字字符串,例如如下 url 中的 123,此类参数会传给后端: www.facebook.com/profile/123 首先将 pokemon-template-form 组件移到 pokeman-ba…

骑砍战团MOD开发(27)-module_tableau_materials.py材质

一.配置材质资源 OpenBrf寻找对应材质资源. tableau配置材质资源 ("round_shield_1", 0, "sample_shield_round_1", 512, 256, 0, 0, 0, 0,[(store_script_param, ":banner_mesh", 1),(set_fixed_point_multiplier, 100),(init_position, pos1),…

golang第六卷---go命令

go命令 go/go helpgo versiongo envgo buggo buildgo installgo getgo modgo rungo cleango docgo fixgo fmtgo generatego workgo testgo toolgo vet go/go help 通过该命令,我们可以查看go语言中的所有命令,其中go与go help两个命令是等效的 如下&…