Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >golang的内存模型与new()与make()

golang的内存模型与new()与make()

作者头像
李海彬
发布于 2018-03-27 03:06:55
发布于 2018-03-27 03:06:55
6340
举报
文章被收录于专栏:Golang语言社区Golang语言社区

要彻底理解new()与make()的区别, 最好从内存模型入手. golang属于c family, 而c程序在unix的内在模型:

|低地址|text|data|bss|heap-->|unused|<--stack|env|高地址|

其中:

(1)text存储程序主体,即机器指令.

(2)data,bss存储全局变量, data存储初始化的全局变量. bss存储未初始化的全局变量. bss全称Block start by symbol, 以符号开始的块.

(3)heap: 动态内存堆

(4)stack: 函数调用栈.

(5)env: 程序执行环境变量.

------------------------------------------------

value types: variable point direct to value, 即变量在函数调用栈中的内容就是value.

reference types: variable point to reference toward heap, 即变量在函数调用栈中的内容是reference, 指向heap中的某块内存.

赋值操作=或:=, 都是将某个variable在函数调用中栈中的内容复制给目标变量. 对于value types是复制值. 对于reference types是复制引用.

new()操作: 在函数调用栈中分配内存, 内容是目标类型的零值, 返回值是目标类型的指针.

make()操作: 先在动态内存堆分配内存, 内容也是目标类型的零值, 再在函数调用栈中分配内存, 内容是分配的堆地址, 返回值是目标类型的值.

注意: 一般来说,

new()用于value types

make()用于reference types.

但是, new()也可用于refrences types, 只是返回值是nil的指针. make()不可用于value types, 编译会出错: make(xxx) cannot make type xxx

对于非elementary(primitive) type,即非基本类型, new()等价于&Type{}, 但对于基本类型, 不支持&P{}语法, 就必须使用new()来创建指针.

对于初始化空值, make(Type)行人于Type{}, 但要初始化多值, 就必须使用make(Type, m)

以上原则更多体现在长变量声明long variable declaration, 与短变量声明short variable declaration. 对于后者, 更常使用new()与make()初始化.

---------------------------------------

由于reference types的特点, 容易造成某些陷阱, 例如: 多个reference指向heap中的大内存,导致不能及时释放造成内存泄露危险.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
谈一谈JavaScript的内存模型
对我们程序员来说,声明变量、进行初始化和赋值几乎是每天都在做的一件事情。不过,这些操作本质上做了什么事情呢?JavaScript 是如何在内部对这些进行处理的?更重要的是,了解 JavaScript 的底层细节对我们程序员有什么好处?
Chor
2020/07/06
7330
【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )
程序运行后的内存布局 : 从高地址 到 低地址 介绍, 顺序为 栈 -> 堆 -> bss段 -> data 段 -> text段 ;
韩曙亮
2023/03/27
2K0
【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )
深入理解Linux C语言内存管理
 问题不能拖,我这就来学习一下吧,争取一次搞定。 在任何程序设计环境及语言中,内存管理都十分重要。
用户6754675
2019/12/26
2.9K0
全栈必备 :C语言基础
【引子】温故而知新,“三日不弹,手生荆棘”,代码也是如此。另一方面,自己挖的坑要自己填。在《全栈的技术栈设想》中埋下了4种编程语言的伏笔,已经兑现了Javacript,Python和Java, 本想将C/C++一并整理,但涉及面向对象等设计技术,最终还是C 梳理一下,从0到1吧。
半吊子全栈工匠
2021/06/10
1.3K0
全栈必备 :C语言基础
C++学习总结2——C++内存模型
对于一个C++程序,内存区域分六个部分:依次是rodata区,text区,data区,bss区,heap区和stack区。
王云峰
2019/12/25
6440
C++学习总结2——C++内存模型
[c语言日寄]计算机内存区域总览与关于函数栈帧的小知识
常量存储区用于存储程序中的常量数据,如字符串常量和其他只读数据。这些数据在程序运行期间不可修改,通常存储在只读内存区域。
siy2333
2025/02/05
960
C语言内存讲解-详说内存分布和heap空间
程序没有加载到内存前,可执行程序内部已经分好3段信息,分别为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分(有些人直接把data和bss合起来叫做静态区或全局区)。
莫浅子
2022/11/18
6830
C语言内存讲解-详说内存分布和heap空间
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
LuckiBit
2024/12/11
5450
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
Go内存模型
Go语言中内存分配大致有3种模式:Stack、Heap、Fixed Size Segment。
叫你不戴帽子
2018/10/27
2.5K0
Go内存模型
结合多种系统api来理解堆栈的概念
数据结构中栈具有后进先出的特点,我们提到堆和栈空间的时候,指的是数据在内存中的概念,对栈空间,基本的认知包括:
呱牛笔记
2023/05/02
3850
结合多种系统api来理解堆栈的概念
C/C++内存管理-学习笔记
内存在程序编译的时候就已经分配好了,在程序运行期间这块内存都存在,如全局变量,static变量等。
黑光技术
2019/03/06
1.1K0
C/C++内存管理-学习笔记
C程序内存布局
作为计算机专业的来说,程序入门基本都是从C语言开始的,了解C程序中的内存布局,对我们了解整个程序运行,分析程序出错原因,会起到事半功倍的作用 。
高性能架构探索
2021/05/18
3.7K0
C程序内存布局
linux进程内存布局
一个程序本质上都是由 BSS 段、data段、text段三个组成的。这样的概念在当前的计算机程序设计中是很重要的一个基本概念,而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。
sunsky
2020/08/20
3.4K0
【专业技术】程序在内存中如何分配的?
好多初学者可能对程序在内存中如何布局都有疑问,在我们和用户的沟通过程中也发现有好多同学问相关的问题。这里转一个文章,讲得很不错的,大家可以看一下。 栈主要用来存放局部变量, 传递参数, 存放函数的返回地址.esp 始终指向栈顶, 栈中的数据越多, esp的值越小. 堆用于存放动态分配的对象, 当你使用 malloc , new 等进行分配时,所得到的空间就在堆中. 动态分配得到的内存附带有分配信息, 所以你能够 realloc 和 free调它们. 全局,静态和常量是分配在数据区中的。数据区包括bs
程序员互动联盟
2018/03/14
9340
【专业技术】程序在内存中如何分配的?
C++的内存布局
编译器和汇编器创建的目标文件包含:二进制代码(指令)、源码中的数据;链接器将多个目标文件链接成一个;装载器吧目标文件加载到内存。
软件架构师Michael
2023/09/01
4850
【C语言动态内存管理】—— 智能分配与精准释放之道,打造高效内存循环
在之前的学习中我们已经学会了内存开辟的方式,如定义变量或者定义数组都会在栈上开辟空间,申请内存!
换一颗红豆
2024/12/20
1.1K0
【C语言动态内存管理】—— 智能分配与精准释放之道,打造高效内存循环
科普一下程序运行时内存分配
代码段(code segment/text segment )通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等
大话swift
2019/10/08
1.8K0
科普一下程序运行时内存分配
【C++指南】C++内存管理 深度解析
在 C++ 中,内存管理是程序开发中至关重要的一环。由于 C++ 允许程序员直接操作内存,这既赋予了极大的灵活性,也带来了一定的复杂性和风险。高效且正确的内存管理对于编写高性能、稳定可靠的 C++ 程序起着关键作用。
倔强的石头_
2024/12/06
3190
【C++指南】C++内存管理 深度解析
C/C++ 学习笔记七(内存管理)
相对于其他语言,C、C++的一大利器便是可以非常灵活的控制内存。与此同时,另一方面灵活的带来的要求也是十分严格,否则会出现令人头疼的分配错误、内存越界、内存泄漏等众多内存问题。 程序内存结构 C程序的
Celebi
2017/08/25
2K0
C/C++ 学习笔记七(内存管理)
玩转C++内存管理:从新手到高手的必备指南
C++中的内存管理是编写高效、可靠程序的关键所在。C++不仅继承了C语言的内存管理方式,还增加了面向对象的内存分配机制,使得内存管理既有灵活性,也更加复杂。学习内存管理不仅有助于提升程序效率,还有助于理解计算机的工作原理和资源分配策略。
平凡之路.
2025/06/02
1700
玩转C++内存管理:从新手到高手的必备指南
相关推荐
谈一谈JavaScript的内存模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档