对快速堆栈和堆的理解

问题描述 投票:40回答:2

我想快速了解堆栈和堆中存储的内容。我有一个粗略的估计:基本上,您根据值和引用类型显示的所有内容和内存地址均不显示值,而是存储在堆栈中的内容,以及作为值打印出来的内容,这些内容都在堆中。我完全错了吗?并且可以选择以可视方式表示堆栈/堆吗?

ios memory swift stack heap
2个回答
58
投票

@Juul所述,引用类型存储在堆中,值存储在堆栈中。

这里是解释:

堆栈和堆

堆栈用于静态内存分配,而堆用于动态内存分配,都存储在计算机的RAM中。

在堆栈上分配的变量直接存储到内存中,并且对该内存的访问非常快,并且在编译程序时确定其分配。当一个函数或方法调用另一个函数,然后又调用另一个函数等时,所有这些函数的执行将保持挂起状态,直到最后一个函数返回其值为止。堆栈始终按LIFO顺序保留,最近保留的块始终是要释放的下一个块。这使得跟踪堆栈真的非常简单。从堆栈中释放一个块无非就是调整一个指针。

enter image description here

在堆上分配的变量的内存在运行时分配,访问该内存的速度稍慢,但是堆大小仅受虚拟内存大小的限制。堆中的元素彼此之间没有依赖关系,并且始终可以随时随意访问。您可以随时分配一个块,并随时释放它。这使跟踪在任何给定时间分配或释放堆的哪些部分变得更加复杂。

对于转义关闭:要记住的重要注意事项是,如果在闭包中捕获了堆栈中存储的值,那么该值将被复制到堆中,以便在执行闭包时仍然可用。

更多参考:http://net-informations.com/faq/net/stack-heap.htm


16
投票

类(引用类型)在堆中分配,值类型(例如Struct,String,Int,Bool等)位于堆栈中。有关更多详细答案,请参见本主题:Why Choose Struct Over Class?

© www.soinside.com 2019 - 2024. All rights reserved.