【Golang】关于内存、地址和指针的概念

内存

数据和程序的临时存储位置。

在内存中有”地址”和”内存区域(存储区域)”这两个概念。

スクリーンショット 2023-10-28 23.10.13.png

地址

在将数据保存到计算机内存时,指的是将数据存储在事先为存储该数据而分配的内存中,该内存具有一个唯一的编号(地址)。

以十六进制表示

内存空间

数据和程序存储区域。

存储器区域中包含了”数据”和”指令”。

存储位置由关联的地址确定。

Golang中的内存地址是什么意思?

在变量前面加上“&”可以获取地址。

如果不加上「&」,就会获取存储器数据。

スクリーンショット 2023-10-28 23.12.22.png

Golang中的指针变量是什么?

在「存储地址的变量」前面加上「*」,可以定义指针变量。

指针是

存储内存地址,并且可以访问该地址的内存空间值的变量。

スクリーンショット 2023-10-28 23.13.40.png

Golang 中的指针类型是什么?

在类型名称之前添加”*”的数据类型称之为

将地址赋值给指针类型。

以指针类型定义的变量会成为指针变量,并且具有与上述相同的行为。

スクリーンショット 2023-10-28 23.14.10.png

值传递

将内存区域的值直接复制,并存储到另一个内存区域中。

因为它被存储在另一个内存区域,所以复制后的地址会发生变化。

スクリーンショット 2023-10-28 23.15.48.png

参考转交

将地址存储到另一个内存区域中。

根据该地址,可以访问源内存空间的值。

スクリーンショット 2023-10-28 23.17.21.png

内存区域的类型

在内存地址中存在着”低位地址”和”高位地址”。

从低地址到高地址,依次分配“程序区域”→“静态区域”→“堆区域”→“栈区域”。

スクリーンショット 2023-10-28 23.18.03.png

参考図中分配了各种内存区域到内存中。

スクリーンショット 2023-10-28 23.21.25.png

程序区域

存储机械语言转换后的程序指令。

逐行执行时运行。

宁静之境

全局变量、常量等被放置。

在程序开始时进行初始化,并在程序的整个生命周期中持续存在。

堆区

保持着动态数据。

可以在不受函数范围限制的情况下保留对象。

・确保、解放的速度较慢

・命运在我们自己手中

・尺寸很大

・尺寸会根据实际需要动态确定。

・在各个新资源和其他途径中保留的

使用Go编译器时,无法分配内存的值会逃逸到堆上。

・收到GC处理

通过Go编译器和运行时,在何时使用以及何时进行清理都无法确定。

堆栈区域

保留静态数据

不使用GC时更高效。

确保和解放的速度快。

・寿命不长

・大小尺寸

・局部变量、参数、返回值、静态结构体、原始值等

・与词法作用域相关联的内存被分配

Go编译器分配内存

・用于存储goroutine堆栈的地方

各个领域总结

スクリーンショット 2023-10-28 23.26.02.png

Golang的堆和栈

在内部,优先使用堆栈。

请查阅相关资料

 

广告
将在 10 秒后关闭
bannerAds