卜若的代码笔记-数据结构系列-第一章:指令和5大区(栈区和堆区等)的基本概念

这是一个数据结构系列,整个系列会详细介绍基本数据结构的实现,以及各种结构的用途,并且会列举一些经典算法案例。      

对于刚入门学习数据结构的同学,通常会需要了解什么叫栈区什么叫堆区。这需要和后面的数据结构里面的栈和堆的概念做一个区 分,这一点非常重要。

1.指令的存储

先来看一个简单的代码片段

如果用中文来描述这个过程

a.我定义了一个变量a
b.定义一个变量b
c.输出a+b的值

如果你学过汇编,那就知道,其实就是简单的mov,add指令。但是你没学过,就按照上面的中文过程理解。

那么,计算机是怎么知道要使用这个中文过程来执行上述问题呢?

答案就是:cpu从内存中读取到这一系列的指令。

当然,高级语言向低级语言的翻译过程你可能需要去了解一下,过程相对比较复杂,这里仅仅只是抽象的告诉你答案。

 

当你在编译器里面定义了一个main函数,并在里面定义了一些高级语句之后。

在运行之时,这些高级语句将会被翻译成机器理解的指令,存放到内存里面。

然后cpu开始从内存里面去获取指令,并根据指令的操作,实现数据的搬迁和运算。

那么,到这里,我们其实很容易理解,在计算机执行的过程中,主要会操作两种单位

指令和操作数

并且二者都存放在内存里面,只是通过某些方式进行区分,具体的你们可以去进行查询,这里不做详细介绍。

2.c++的五大区

2.1栈区

什么叫栈区?栈的概念就是后进先出。具体的概念可以去查一下其他博客,或者我后面的系列,在第一章里面不做太详细的介绍。当你知道它是后进先出的时候,你就会应该有一个叫做释放的概念。需要注意的是,释放节点通常是:

函数运行时分配,函数结束时释放

依旧是这段代码

这个运行结果肯定是30,弱智一样的代码。

那么现在有一个问题,a,b在 运行中,它肯定是会存储到ram(如果不知道ram是啥,请温习大学计算机基础)是吧,存在哪?既然我写在栈区,那肯定是在栈区咯。

当我运行的时候,整个运行的程序是一个顺序结构的。从上至下的。然后操作数会丢到整个栈中,比如

push(10)

push(20)

push(30)

函数结束,则释放,pop(30),pop(20),pop(10)

这就是栈区管理内存的方式,这种做法会极大的优化内存的管理。

另外一个问题

当出现一个while循环后,栈区怎么工作的呢?其实差别不大,因为函数运行结束后才会释放,这也是我为什么之前对这句话会有标红。 

2.2堆区

栈区能解决100%的事情吗?肯定不是的啊,我有些东西是完全不希望它能够被释放的,哪些东西呢?比如我希望我的一个class对象能够夸函数调用,是吧,这个时候我就希望这个class不被释放。

而释放的过程则通过手动释放,或者更不负责的说,当我不用它的时候,它自己释放呗。

那么,我们就不能将这个class放到栈区了。那个就需要有一个新区去存储,而这个区就是堆区。

那么怎么区分是在栈区还是堆区呢?

有一个关键字叫new,当你new一个对象的时候,就会存放到堆区里面。

当然这是java和c#的习惯,c++也有,c++还有的就是malloc函数等用于分配内存的函数。

2.3自由存储区

它是建立在堆上的抽象概念,我帮你们找了一个解读比较好的博客

https://www.cnblogs.com/QG-whz/p/5060894.html

2.4静态区

当你定义static的时候,定义的变量就存放在静态区。

那么问题来了,单例模式,不管是饿汉还是懒汉,他们的存储形式是什么样的呢?

一个懒汉模式:

 那么你可能得需要知道对象引用。

什么叫引用?你可以理解它为一个指针,但不幸的是,java或者c#里面已经渐渐的取消掉了这种称呼,而是用的对象引用。当然你可以理解为指针也没啥问题

我定义的这个字段

就是一个对象引用,就是一个指针,只是在面向对象里面强调指针好像怪怪的。

当我new一个对象的时候,new的对象会存储到堆区。

so:敲黑板

当你定义一个单例模式时,Instance的引用存放到静态区,而它指向的真正的对象则存储到堆区。

 

2.5常量区

你定义一个const常量,就存放在常量区咯,这个简单!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值