美文网首页
OC中的栈和堆区别

OC中的栈和堆区别

作者: 骑着毛驴走起来 | 来源:发表于2019-01-09 23:52 被阅读41次

一、管理方式:

栈是由编译器自动管理的,不需要我们手动释放。

堆是系统通过链表管理维护的,由我们自己申请和释放,容易产生memory leak。

二、申请大小

栈是向低地址扩展的数据结构,是一块连续的内存区域,也就是栈顶的地址和栈的最大容量是系统预先规定好的。大小有限,大约2M左右,如果申请的空间超过栈的剩余空间时,就会提示overflow。所以,能从栈获得的空间比较小。

堆是由高地址扩展的数据结构,是不连续的内存区域。堆获得空间比较灵活,也相对来说比栈的大

三、分配方式

栈有静态分配和动态分配两种

堆是动态分配的,没有静态分配这一说

四、碎片问题

栈由于是连续的,先进后出的队列,一一对应,没有碎片

堆:频繁的创建和释放必会造成内存空间的不连续,进而造成大量的碎片,使程序效率降低。

五、分配效率

栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高

堆则是C/C++函数库提供的,它的机制是很复杂的。

六、注意一下几点:

队列是先进先出,栈是先进后出

在OC中默认不带*号的都是保存在栈区的(比如:局部变量int i = 10,变量名i就是变量保存在栈区的内存地址的别名)

int main(int argc, const char *argv[]){                                                                                        int i = 10; int j = 20; int k = i + j;                                                                                                        }                                                                                                                                                    //执行main函数,i首先进入栈区,位于最底部,然后j进入栈区,然后k再进入栈区,当程序执行结束后,栈区的所有元素会从上到下一次出栈,栈恢复到原始状态。

补充点线程的知识:IOS中,每条主线程占用1M内存,每条子线程大概占用512k内存。每个线程都会对应的一个栈区,当线程开展了多条线程的时候,每个线程都会开辟一个栈区,当线程执行完毕后,对应的线程的栈区就会依次被清掉

八、网上有个有个很经典的例子:

使用栈就像是我们去饭馆里吃霸王餐,只管点菜(发出申请),吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作。好处是快捷,但是自由度比较小,人家做成什么样的菜你就吃什么样的。

使用堆就像是自己动手买菜,做菜,刷锅,洗碗。比较麻烦,但是自由度比较大。

相关文章

  • OC中的栈和堆区别

    一、管理方式: 栈是由编译器自动管理的,不需要我们手动释放。 堆是系统通过链表管理维护的,由我们自己申请和释放,容...

  • 10.11java中的堆和栈

    java高级-堆和栈 java堆 /栈 栈内存 / 堆内存的区别 1. java堆 /栈 2. 栈内存 / 堆内存的区别

  • GeekBand oc课程笔记

    oc课程笔记 堆和栈的区别 指针是存放在“栈”上,而对象时存放在“堆”上的,访问对象职能通过指针的方式来访问。 栈...

  • java中栈内存和堆内存有什么区别

    java中栈内存和堆内存有什么区别 栈内存和堆内存的区别: 1、栈内存用来存放基本类型的变量和引用变量,堆内存用来...

  • Js的浅拷贝与深拷贝

    堆和栈的区别 堆和栈都是内存中划分出来的用于存储的区域。 深拷贝与浅拷贝的区别就是其在内存中存储的类型不同。 栈(...

  • 多线程中 堆和栈的区别

    1.多线程中 堆和栈的区别

  • OC堆和栈存储内容的区别

    举例:对象存储在堆,而block存储在栈。创建一个对象: 这行代码创建了一个obj对象,指针obj存储在栈,obj...

  • 栈和堆以及栈区和堆区的区别

    栈和堆以及栈区和堆区的区别 数据结构中的栈和堆 栈:具有先进后出性质的数据结构 堆:一种经过排序的树形数据结构,节...

  • js底层数据类型

    js底层数据类型 堆和栈的区别 其实深拷贝和浅拷贝的主要区别就是其在内存中的存储类型不同。 堆和栈都是内存中划分出...

  • 内存管理相关

    1.堆和栈 堆:存放OC对象,先进先出。(吃了拉) 栈:存放非OC对象,先进后出。(吃了吐) 2.@propert...

网友评论

      本文标题:OC中的栈和堆区别

      本文链接:https://www.haomeiwen.com/subject/tfanrqtx.html