我想快速了解堆栈和堆中存储的内容。我有一个粗略的估计: 您打印的所有内容和内存地址都不是值,而是存储在堆栈中,而作为值打印出来的内容,则在堆上,基本上根据值和引用类型。我完全错了吗?或者,您能否提供堆栈/堆的可视化表示?
最佳答案
作为 @Juul声明的引用类型存储在堆中,值存储在堆栈中。
解释如下:
堆栈和堆
堆栈用于静态内存分配,堆用于动态内存分配,两者都存储在计算机的 RAM 中。
分配在栈上的变量直接存储到内存中,访问这 block 内存非常快,它的分配是在程序编译时确定的。当一个函数或方法调用另一个函数,而另一个函数又调用另一个函数等时,所有这些函数的执行将保持挂起,直到最后一个函数返回其值。堆栈始终以 LIFO 顺序保留,最近保留的 block 始终是下一个要释放的 block 。这使得跟踪堆栈变得非常简单。从堆栈中释放一个 block 只不过是调整一个指针。
在堆上分配的变量在运行时分配了它们的内存,访问这 block 内存有点慢,但堆大小只受虚拟内存大小的限制。堆的元素彼此之间没有依赖关系,并且总是可以随时随机访问。您可以随时分配 block 并随时释放它。这使得在任何给定时间跟踪堆的哪些部分已分配或空闲变得更加复杂。
对于转义闭包:
需要记住的一个重要注意事项是,如果存储在堆栈中的值在闭包中被捕获,则该值将被复制到堆中,以便在执行闭包时它仍然可用。
关于ios - Swift 栈和堆的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27441456/