【编程基础】值类型和引用类型

前言

值类型和引用类型,对于使用了托管内存的编程语言来说,他们的最大差距就是在分配和回收上的差距。

  • 值类型
    它是在存储在栈上的,当你在创建它的时候,它被压进栈内,在它出栈前,它都将可用,把它传进别的函数内使用的时候,这个时候复制了一份它的内容,然后把这个新拷贝内容给压进栈内。所以我们在函数内改变的值,只是改变了这个新压入栈的值,当然了我们也可以把这个值的引用传入进来。这里说将的值类型其实都是在函数中的局部变量。

  • 引用类型
    它是存在托管堆上的,我在这里所说的类型区分都是基于托管内存的编程语言来说的。当我们创建一个对象的时候,先告诉托管堆给我们分配一块内存,然后它把这个内存的地址引用返回给我们,然后我们就在这块内存内做一些操作,存一些数据,一些别的托管内存的一些指针。

引用类型中包含的值类型

如果引用类型中有值类型的变量实例,那它会在分配给它的内存中开辟值类型所需要的内存大小,给值类型用。那这个时候只值类型就被放在托管堆上了。

正文

看完上面的一些东西,是不是感觉很迷茫呢?有些迷糊值类型和引用类型究竟有哪些区别,究竟是放在堆上还是在栈上,它们之间啥关系呢?下面我就来讲讲。

一位仙气少年

在编程世界里,我们程序启动有一个虚拟机在跑。当我们把世界转向一个玄幻的世界里,那这个虚拟机我们让他叫做小m,是一个刚刚从师门出发,将要去入世,去闯荡一番。那现在我们来给他一些入世需要的装备吧。

绝世武功?

在给小m发放装备的时候 ,我们先去了解小m有哪些功法,他可以克隆一切物体,还会一种世界上绝无仅有的功法,那就是空间术。当他在学习这门功法的时候,他也继承了前人开辟的一大块空间(这个就是托管堆的空间大小),他可以自己去这块大的空间里切割一部分归自己所用。在了解了这些之后,我们来给小m发放装备了,俗话说得好的好,功夫再好也怕手枪,所以我们先给他一把枪,这把枪有个特殊的属性,就是能发射任何东西,但是,大家也知道,弹夹有个特性,就是最后压进来的子弹是最先发射出去的(这就是栈)。其实有了这把枪我们就可以不需要再去给他发放什么装备了。

空间戒子

小m在收拾东西的时候,发现自己想带的东西太多了。这个时候他想起来了自己的空间术。他在仔细研究之后,发现在自己切割下来的空间内,能放和自己相关的任何东西,那他就开始创建了一个空间指环,但是有个不同的情况就是,空间术创建的时候,它的空间大小是不能更改的,当你创建的时候是多大,那就是多大,当你创建的空间指环不够你使用的时候,你就需要重新创建一个更大的空间,然后把原来空间的东西给搬到新空间里,在这个操作是,需要很耗费小m的功力,需要花费他很多时间。现在小m已经创建了一个空间戒子了,他现在把这个戒子带到身上去了(获取引用)。

Hello Word

现在小m带齐了自己的所有装备开始下山了,他下山后看着这个未知的世界,他不知道怎么的就像对着这个世界说上一句“Hello Word”。那现在它就开始使用它的枪打出这几个字了,它开始一个字符一个字符的压入枪内d,r,o,w o,l,l,e,h。然后一口气打出了九发,但是它觉得太不爽了,连续扣动扳机太累的。转念一想,自己有个空间术吗?这把枪不是可以射出任何东西,是不是可以把我这个空间术内的这一整块空间射出去呢?它就开始使用空间术来创建了一个特殊的空间,就是为了能把字符全部装进,这个空间他为了保险,还做了一个限制,就是我只能放一次字符的集合,后面再放进去,那就只能重新在创建一个新的空间,把之前的字符集合给拷贝进去,然后再添加。好了,现在我们开始把这个字符串空间打出去了。一枪出去,天空上炸出了一整句“Hello Word”。小m现在太兴奋了,感觉自己创造了功法的一种新的使用方法。然后疯狂的往天上打枪。

子弹不够了?

突然小m发现他打出来的子弹是空弹,啥都看到。这个时候他也发现了不正常的情况,就是他不能再使用空间术了,这个时候小m慌了,他觉得他最大的一个依仗没有了,他懊恼自己的浪费。这个时候,他疯狂的翻自己的秘籍,就像知道,怎么让自己重新获得空间术。他查了一遍又一遍,终于发现自己的功法不能用是因为他没办法自己开辟空间,只能用继承下来前人的那一整块空间,但是在刚刚那一波疯狂输出的时候,这块继承的空间以及被消耗殆尽了。然后他再一次翻阅前人所遗留下来的文档,发现了,这个空间术在开辟空间的时候,只是暂用了前人的空间,前人空间有个特殊的属性,就是,当发现你没有再使用的时候,它就会把这被你借走的空间给拿回来,把里面的东西清空了。但是这个属性跑起来的这段时间内,小m就没有办法使用空间术了。小m发现了这样的一个属性的时候很高兴呀,感觉自己将再一次能掌握到空间术了,他开始研究起来,究竟什么情况下会被认识这块空间不被自己使用了。原来是自己把空间术所返回过来引用给遗弃掉,就是当自己从枪里发射出去,其实就是把引用给抛走了。现在小m就开始等待空间恢复了。

这颗子弹真奇怪

小m在探险的时候,发现了一种特殊的材质(接口),我们称这个材质为I。这个材质自带一种空间属性,小m用这个材质做了一枚子弹(struct),当这枚子弹在使用的时候被当成I类型使用的时候(装箱),它就突然变成了一个引用类型,它会把它所有的东西都包装到空间槽内,然后把自己变成一个引用类型的子弹。当把它当成一个struct类型的子弹使用的时候(拆箱),它会把它放置在空间槽内的东西都打包拿出来,变成一个真正的子弹,那部分被它用来放物体的空间槽就被遗弃了。等待回收。

后记

这篇太难产了,想换个写法,感觉自己还是写不出来,这种的写法不太适合我

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注