00:00
那各位我们来看一下切片啊,一个快速入门完了过后呢,我们应该对切片在内存中存在的形式给大家做一个分析,这块是比较重要的。注音这块比较重要,我们知道往往涉及到底层的这些原理性的东西呢,都是非常重要的,我们现在为了让大家更加深入的理解切片,就你要把切片理解到位,那这里呢,我们画一个图来分析一下切片在内存里面是如何布局的。这是一个非常重要知识点,大家注意一下,那我们在分析的时候呢,为了让大家听的比较轻松一点,我们就以前面的案例来分析,就是咱们不搞别的东西了,咱们呢,就根据前面这个案例来画出切片在内存里面的。布局以及切片和它引用的这一个数组之间的关系是一个什么样的情况,这块非常的有意思啊,非常重要。来,我们来看看切片在内存中的布局,给大家聊两句,我们就以前面的案例来说。
01:06
这是做标题二。好,这里做了一个基本的介绍。基本的介绍。那这块基本介绍呢,就是老师刚才说的这么一句话,那现在呢,我们来画出一个图。画图说明。我们来画图说明一下。OK。画图画出画出前面的切片案例,切片案例。的这个示意图画出切片的。内存布局吧,内存布局。内存布局。好的,我们来聊一聊这个话题。这是一个本质性的东西,好,为了让听的轻松一点呢,我们还是老规矩,打开我们的Excel表,打开Excel表,我们在这里来进行这个图形的化解。
02:01
好,我们说一下。切片。在内存的布局示意图。来聊一下这个话题。把这个呢,我们稍微的放大一点好吧。好,我先把代码放过来,因为我们既然要讲呢,我们得有代码这个玩意儿,对吧,没代码的话呢。光在那干说是不行的,我先把代码放到这边来。没问题吧,这个代码非常的简单。然后呢,我再画出我们的一个内存。来假设这是我们的内存没问题吧,好,我们代码现在开始走了,第一句话,当我们的代码执行到这个位置的时候。那么大家都知道数组它是一个子类型,当他这样声明,声明过后呢,在我们的内存里边就存在这样的一个变量。叫int。瑞这个没问题吧,特瑞好,这个特瑞呢,它就会指向。
03:05
一个内存空间,好,我把内存空间给大家画出来。我们就以这个为例吧。好吧。好,然后呢,我把它。标成另外一个颜色,不然这个不标颜色不好看。看不出来,我标成黑色没问题,这时我们知道int a呢,它其实里面有几个元素,它一共有五个元素,是这样子的吧,一个元素。我把它画成五个小空间。好可以了,大大不齐是这样子的啊,可能不是画的非常的均匀,那这个时候int呢,它就。直接因为它是数,它是直类型嘛,他就直接跟他进行了一个关联。好,指向我们这个数组,数组里边一共有五个元素,我分别的写一下。第一个元素是一。
04:03
第一个元素是一,第二个元素是22。第二个元素是22,第三个元素是33。33。第四个元素是66。66。第五一个元素是99,好,在内存里边特瑞其实就是指向这么一个空间的,能理解吧。问题,好,当我们的这个数组走到这做了一个切片过后,Sli做了这个动作过后会怎么样呢?老规矩,我们接着来画,当我们做了一个slice。Int切片。切的是一到三。好,我们看看内存里面它又是怎么存在的,当他做了这样一个工作以后呢,各位同学请注意,其实切片它可以的,它其实包含三个非常重要的部分。
05:03
他可以这样理解。它可以包,你可以把它理解成它包含了三个部分,其实切片的本质啊,你可以理解成是一个数据,是一个数据结构,什么数据结构呢?结构体好我我这一写你就就明白了,他这样子的。它有三个部分追听。第一个部分注意听啊,第一个部分就是这个地址指向谁呢?指向这个22号这个元素的地址。为什么是指向22呢?因为你这个切片是切到一的,是从是指向这个a int这个数组的第二个元素,第二个元素不是它吗?那特我问大家,请问你能告诉我22号这个元素的地址是多少吗?有同学能不能知道,如果你不知道的话呢,我们可以先把它打印出来。追听。我们就从内这个底层啊地这个内存的地址,从这个最底层来分析,我们来看看此时此刻IN2。
06:09
一他的地址是。他的地址是多少呢?输出来。我们把它取出来好不好取出来int。一好,我先执行一下,同学们我先执行一下,诶,那这个地方就应该是go wrong。Me点够,我们看一下这个地址是多少。好,注意听,这个时候我们看到他的地址是他。也就是说大家可以这样去认为,在我们的这个slice的这个数据结构里面,它的第一个部分我稍微扩大一点,它的第一个部分就是一个地址,这个地址指向哪里呢?就指向它引用的第一个元素。
07:01
引用的第一个元素就是22号元素,因为它第一它它的第一个元素是in,特瑞的第二个元素就是22,那大家刚才也看到了,22号元素的地址其实就是它。是这个意思吧,刚才同学们也看到了,那这个地址呢,我们也把它拿过来。这样这样是不是直接就把最底层的东西给他展现出来了。好。没问题吧,因为你这个地址是他他的地址也它所以说他就指向他了。他就执行他了,这是第一个要说的。那有些同学就要说了,说老师你怎么敢这么肯定莱里面有一个。它有一个部分就是指向它的呢,我可以给你们这样证明,我可以这样给你们证明,因为slash的第一,它的第一个元素。就是指向这个int的第二个元素的,因此如果我要去输的话,我可以把slash的第一个元素的地址输出来,你们会发现这两个地址是一样的。
08:04
那我给他再做一个证明。因为你要分析到底层呢,你就必须用指针来说话,比如说我现在给大家证明一下,我说S莱SH的第零个元素,哎,莱的第零个元素是不是就是in特瑞的第二个元素啊啊。第它的第零个元素,它的第零个元素是不是就是。就是它第零个下标为零,是不是就是来时的第一个元素嘛。是吧,它的第一个元素是不是指向in特瑞,下边为一的这个元素其实就是in特瑞的第二个元素,它们地址只要相同就证明是一样的了。好,我给大家说一下这个s less,呃,就写到啊。它的值我们也一并把它输出来。S0,它的值等于多少?也给他输出来大家看,嗯,其实它的值大家应该可以肯定的知道,就是22。
09:03
大家来证明一下这个观点啊。走一个,我们可以看到,此时此刻,我们发现这两者是相同的。就是第二个元素的地址。和slash的第一个元素的地址是一样一样的。而且它的flash的第一个元素就是22。就是就是一个22。好,那就证明他们之间的的确确是相同的了,这点大家不用怀疑了吧,他确实是相同的,那么问题是LA它后面还有两个用来存放什么呢?注意,一个是用来存放这一个slash的长度,实际上这个长度大家知道它就是二,还有一个,还有一个部分呢,可以用来存放什么呢?可以用来存放石来石的它的容量。就是这个。Capability等于四,它这样子的大家看到没有,所以说所以说在内存。
10:05
这个里面在我们这个底层呢,Slash呢,其实它是你可以认为它是三个部分构成的,哪三个部分呢?一个是它指向的或者说引用的那一个数组的那个地址。数组的第几个元素的地址?明白吧,那第二个呢,就是记录了slash它本身的一个长度。第三一个部分呢,记录了代它的容量的大小。其实就这样子的,因此我们经常有有人这么说,说老师,那实在是是不是它的数据结构就是一个结构体啊,其实这个地方已经是个结构体了。待会呢,我把这个结构体给他给你们看一下,其实在如果我们用一个结构体来说的话,Slash的结构体它是这样子的。因此我们从上面可以看到总结。从上面。
11:02
从上面可以看出。看出什么呢?第一个就是slash。的确。的确是一个引用类型。为什么我们就说它是一个引用类型呢?因为它是引用到一个地方的。对不对,那当然有同学就要问了,说老师莱本身有没有地址,他肯定它本身还有一个地址,就说他莱本身地址的话,你你们可以取出来,就是相当于这块空间,就是现在老师高量这块呢,本身还有个空间,因为只有空间才能存放,存放这些数据嘛,对吧,只是说他的空间呢,有一部分是用来存放地址的。这个地址,这个空间的地址我就不打印出来了啊,如果你们你们有兴趣的话,还可以把莱本身的地址打出来,如果本身地址打出来的话,那就相当于是这个地方了。那相当于我简单试一下10X什么什么什么什么什么什么,那就这。
12:01
就是实在是本身还有一个例子对吧。但是他这个地址里面呢,它的这个它的空间里面有三个部分,分别存放的是三三种三种这个内容,好这是第一点,第二点呢,我们说到slash呢,Sla可以理解成是从从底层来说啊,从这个底层。底层来说,其实。其实就是一个数据结构。那么是一个什么样的数据结构呢?是一个叫做structure这个结构体的数据结构。那有些同学说了,说老师这个结构体我们还没学呢,的确结构体我们马上就学,但目前还没学,你可以认为它是这样长,长的这样子的。简单给他试一下E。他是这样子的。然后里面呢,至少有三个。三个这个呃,它的属性啊,或者叫做成员一个呢,就是PTR。
13:07
这个一般我们叫PTR,各位同学。追听。这个是PTR指针。好,第二个这个里面呢,第二部分。第二部分这个地方我们把它称之为嫩。所以上面呢,我就不要再写N等于了,好吧,再一部分呢,再下一部分。Capability。而这一部分呢?这一部分就是它的容量,存放容量的地方,所以说这上面呢,我也把它拿掉。啊拿掉,那也就是他的这个结构体里面至少有三三个三个元素,哪三个呢。我们把它写到这里来,一个就是PTRPTR是个什么东西呢?是一个指针,是一个根据实际情况不一样,它指向的指指针类型是不一样的啊,比如说在这呢,它的类型就应该理解成是这样一个指针。
14:02
能理解吧,还有呢,它还有一个属性,或者叫做,或者叫做成员呢,叫嫩,这个呢是一个性。对吧,还有一个呢,就是capability。是类型,你可以理解成slash,它就是这么一个一个数据结构,是一个ru,是一个结构体,里面呢有三个部分。对吧,所以说理解到这个地方的话,其实大家就比较相对来说比原先理解的透彻了。理解他说你看他怎么守的,大家看怎么走的,他这样子的。当我们要去引用或者要使用一个slash的时候,其实他是先找到slash这个变量里面的第一个部分,找到它引用的地址,他找到哦,我引用的是这个位置,我引用几个呢?我引用了两个一,也就是说其实现在我们这个slash其实就是22和33。能理解吧?能理解吧,那大家看到它的容量是四这样子的,那大家问大家一个问题,如果我去修改了slash,我通过slash去修改了33。
15:11
我通过代注意听这句话,我通过代去修改了33,我把33改成了34,请问这个数组本身它有没有变化?必然变化了,因为他是引用,是不是,如果你连这块都还没看出来的话,那老师就白讲了,我这个。就白讲了。你们可以试一下,你们可以试一下,比如说我修改一下SLASH1,因为SLASH1大家看这个内存图时代11,其实相当于说他找到它第一个元素,再找到第二个元素,就是找到33了,因为第零个元素才是第一个元素。下标唯一的其实就已经是第二个元素,我把这个改成多少呢?改成34。好,我问大家一个问题,我这样一修改了过后。
16:02
是不是就相当于把这个34,把这个33改成14了,那这样的话,数组本身和这个slash是不是。这个取的这个值都变,都发生了变化,能理解吗?因为它是引用类型。那有有些同学说老师我不相信,不相信的话,我可以给你们输出来看一下。比方说我在这地方再输出一次。我再输出一次,为了能够很明确的看出区别呢,我在这多来几个换行。大家看到。大家看,我再给他跑一下,跑起来请看效果,同学们可以看到。当我们这样做了过后,Int数组的33。变成34了。而时代本身的元素也变成34了,看到这个区别没有,所以说我们说十代这个切片,它的应用效率呢,其实还是蛮高的,因为它是一个引用,它并不是像宿主那样是一个只拷贝对不对,注意这个地方的特点好不好。
17:05
好了,那同学们注意,我这个图只要你记住了啊,只要你把这个图记住了。我可以这么这么讲,关于这个宿主啊,关于这个切片这块呢。就基本上能够。基本上就可以理解了啊,基本上我们也不能说啊,就基本上那个就是说把它底层就理解到位了,诶这个为什么。这样子啊,这样子,我画个图,这样看到引用它指向它,它引用到这个位置,引用到哪里取决于你这个。地址,你这个地址又是取决于哪里,取决于你这地方到底是给的第几个元素,就是这个引用到哪里,取决于它,因为它是找到数组的引用位置,但是这个地址到底是多少,是完全取决于你这个第一个起始位置,起始的下标给的是第几个,能理解吗?好,这个图我们就先分析到这儿了,大家好好看一看。
18:00
看一下,好,我把板梳一下。画出前面切片的内存图,内存图就是这个图。内存图就是老师刚才辛辛苦苦画的这个图非常的重要啊,非常的重要。你把这个图理解了,我可以这么说,就是切片和数组的关系基本上是搞到位了,最后一个对它做一个总结。对。对上面的这个分析。图做一个总结。那我总结了,其实刚才在这其实已经总结了几句话,第一个slash的确是个引用类型,第二个slash从底层来说,其实就是一个structure,就是结构体,它是个结构体里面包含了三个部分,一个是指针,一个是切片的长度,一个是切片本身的什么呀,容量。可以了。把这三点总结到位。哦,把这两点啊,我们总结大家看。
19:02
OK。诶,这帮我们总结好,那关于这一块呢,呃,这块其实这个地方也也就是说的这个意思,一个是画图,一个是structure,一个是引用地址,在图里面就分析的非常到位了,好同学们,那关于我们所说的切片,它的内存的一个布局,我们就给大家分析到这个地方,希望大家通过这个图能够深刻的理解切片。在内存里面的存在布局,以及它跟数组之间的一个关系是什么样子的,好吧,好了同学们,那关于这块呢,我们先介绍到这里。
我来说两句