在像 Rust 的世界,一个值是在stack上还是在heap上对语言的行为和你为什么要做某些决定是有更大的影响的。
在你的代码运行的时候,Stack和Heap 都是你可用的内存,但他们的结构很不相同。
Stack 按值的接收顺序来存储,按相反的顺序将它们移除(后进先出,LIFO)
添加数据叫做入栈,移除数据叫做出栈。
所有存储在 Stack上的数据必须拥有已知的固定的大小。编译时大小未知的数据或运行时大小可能发生变化的数据必须存放在heap上。
Heap 内存组织性差一些:
当你把数据放入heap时,你会请求一定数量的空间,操作系统在 heap 里找到一块足够大的空间,把它标记为在用,并返回一个指针,也就是这个空间的地址。
把数据压到 stack上要比在 heap 上分配快得多:
因为操作系统不需要寻找用来存储新数据的空间,那个位置永远都在stack的顶端,在 heap 上分配空间需要做更多的工作:操作系统首先需要找到一个足够大的空间来存放数据,然后要做好记录方便下次分配。
所有权解决的问题:
跟踪代码的哪些部分正在使用heap的哪些数据,最小化 heap 上的重复数据量,清理 heap 上未使用的数据以避免空间不足。
一旦你懂的了所有权,那么就不需要经常去想stack或heap 了。
但是知道管理 heap 数据是所有权存在的原因,这有助于解释它为什么会这样工作。
每个值都有一个变量,这个变量是该值的所有者;
每个值同时只能有一个所有者;
当所有者超出作用域(scope)时,该值将被删除;