卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章64334本站已运行4115

从Go语言角度浅谈内存分配

为什么要学习C语言

嗯,,,今年是2023年,要是从目前的各种开发项目中开说,C语言的确是用的很少,除了嵌入式等一些一定领域,基本很少能见到C的踪影了,但是为什么还是一直能听到xx说要学好C语言呢?

按照我的理解,其实学习C语言,学的并不是这个语言,而是这个语言背后所代表的一些东西,代表的一些设计,代表的一些本质。


C语言学的好,究竟会带来什么优势

相信不少萌新在群里可能听到某个大佬说,我一星期学完了xx语言,然后直接上手干活,然后你默默的说了一句,装13,也可能,你们就在群里直接杠起来了。

那么,真的可以说,一周,或者两周时间,学会一门语言吗?。

我可以负责任的,告诉你,绝对没问题,但是需要建立在强大的基础上。

而指针,是一个特别重要的基础,现在不管哪个语言,其实本质都是指针的应用,只不过是封装的简单了而已。

但是这造成的就是根基如果不稳,就会造成一些莫名奇妙并且不懂的问题,尤其是对萌新来说。

所以,不管现在不管在任何阶段,没有学习C语言的一定要学学C,捡起曾经丢下的重要的基础。

那么,就先听我简单的入门一下吧。


所需要的技术栈

本次使用的技术栈是Go语言,理论来说是用C语言的,但是因为在指针这一块入门时,Go和C的本质基本一样,所以就采用更加人性化的Go语言。

后期会在加上Python,和Go对比一下,区别在哪,看看烧了一把火的Python是如何分配内存的。

当前,在看此文章时,我还是建议小伙伴有一定基础的,至少能看懂怎么定义变量啥的都行。


操作系统各硬件的关系

首先,我们需要了解一下计算机主要组成部分。

首先,简单的说,至少由 CPU 内存条 硬盘 显卡 显示器 操作系统(Linux,Windowns)等。

那么这些硬件是如何互相配合的呢。

从Go语言角度浅谈内存分配

嗯...大概是这样子的,有点丑。



简而言之就是:

  1. 系统上的每个应用(qq,微信,等)想要让电脑播放音乐了,显示器显示个东西了,像硬盘写入个文件了,都需要经过操作系统的同意。

  2. 操作系统调用CPU完成指令的执行,CPU将打开的应用读取到内存条中,所以,为什么原来在机械硬盘会那么卡,机械太慢了,现在的固态嗖嗖嗖的就完成了硬盘数据到内存条数据的转移。

  3. CPU分析读取到内存条中的应用数据,如果是CPU处理的数据,自己拿走计算,如果是显卡处理的数据,调用给显卡计算,如果是声音数据,给声卡计算,等。

  4. 通过以上协调,整个应用基本就能跑起来了,如果需要将数据写入硬盘,CPU在将内存条中的写入硬盘就行了。

好嘞,通过上述,我们基本可以了解到操作系统和各硬件的协调关系。

悄悄的说个秘密咯,我们写的代码,基本都是运行在内存条中的呢,同理,上述所说的应用,基本也是将应用的代码跑在内存条中的。


内存条

没错,就是这玩意,内存条。

从Go语言角度浅谈内存分配

同理,我还还可以这样理解内存条内部的结构。

我们可以将内存条理解成一个个房子,就像这样。

从Go语言角度浅谈内存分配

依然还是很丑...

但是我们的内存条是有的坐标的,也叫地址,每个小格子里放着一个个的值。

从Go语言角度浅谈内存分配

但是通常情况下,我们都是平面图理解的,就像这样。

地址(坐标)一般以十六进制表示,值该是啥就是傻。

从Go语言角度浅谈内存分配

代码简述

我们来看一段非常短Go的代码。

声明一个age变量并且赋值为18,并且输出。

package main


import "fmt"


func main() {
    var age int = 18
    fmt.Println("我今年:",age,"岁")
}

在内存中如何表示。

从Go语言角度浅谈内存分配

我们的变量名age指向了0x1001地址,并且输出了0x0001存储的值。

就像这样。

从Go语言角度浅谈内存分配

注:一定要理解这句话,变量名指向的就是内存条上的地址。

上述age指向就是地址0x1001

但是我们在fmt.Println("我今年:",age,"岁")打印时,我们打印的是地址里面的

同理,我们在赋值,交换变量时,还是是地址里面的

例如:

从Go语言角度浅谈内存分配

从Go语言角度浅谈内存分配

上述代码内存分配图。

从Go语言角度浅谈内存分配

age2会重新申请一个地址存储age的值18。

可能有时候可能会有人问,星期八,有没有这种情况,他俩同时指向一个内存,这种不是更省内存嘛。

从Go语言角度浅谈内存分配

结果:当然会,这种情况,我们后面会讲到的,现在能看懂就行,一步一步来。


结论

变量名指向的是内存地址

我们在赋值时,或者打印等操作变量时,操作的是地址上面的值


结尾

上述已经很长了可能你们有点晕了,这篇就到此为止了。

如果在操作过程中有任务问题,记得下面留言,我们看到会第一时间解决问题。

我是码农星期八,如果觉得还不错,记得动手点赞以下哈。

感谢你的观看。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

用微笑告诉别人,今天的我比昨天强,今后也一样。

如果你觉得文章还可以,记得点赞留言支持我们哈。感谢你的阅读,有问题请记得在下方留言噢~

想学习更多关于Python的知识,可以参考学习网址:http://pdcfighting.com/,点击阅读原文,可以直达噢~

------------------- End -------------------

从Go语言角度浅谈内存分配

往期精彩文章推荐:

  • 一篇文章带你了解Go语言基础之网络编程

  • Go语言基础之结构体(冬日篇)

  • 一篇文章带你了解Go语言基础之并发(channel)

从Go语言角度浅谈内存分配

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Go学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

卓越飞翔博客
上一篇: 白话Go内存模型Happen-Before
下一篇: 如何使用PHP函数进行表单验证和处理?
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏