OC中的栈和堆
来源:互联网 发布:放置江湖ios数据修改 编辑:程序博客网 时间:2024/06/05 08:15
管理方式:
- 栈是由编译器自动管理的,不需要我们手动释放。
- 堆是系统通过链表管理维护的,由我们自己申请和释放,容易产生momoey 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内存。每个线程都会对应的一个栈区,当线程开展了多条线程的时候,每个线程都会开辟一个栈区,当线程执行完毕后,对应的线程的栈区就会依次被清掉
网上有个有个很经典的例子:
- 使用栈就像是我们去饭馆里吃霸王餐,只管点菜(发出申请),吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作。好处是快捷,但是自由度比较小,人家做成什么样的菜你就吃什么样的。
- 使用堆就像是自己动手买菜,做菜,刷锅,洗碗。比较麻烦,但是自由度比较大
0 0
- OC中的栈和堆
- OC基础 -- 堆和栈的区别
- OC中堆和栈的区别
- OC中栈和堆内存区别解析
- java中的栈和堆
- Java中的堆和栈
- Java中的堆和栈
- java中的栈和堆
- c++中的堆和栈
- java中的堆和栈
- Java 中的堆和栈
- Java 中的堆和栈
- c++中的堆和栈
- c++中的堆和栈
- c++中的堆和栈
- c++中的堆和栈
- c++中的堆和栈
- Java中的堆和栈
- VMware fusion设置端口转发
- 关于scanf,printf,char与strcm
- GreedySelector
- 杭电ACM2111——Saving HDU
- 戏说23种设计模式
- OC中的栈和堆
- linux下的多线程学习
- 代码操作XML(增删改)
- java配置环境变量问题,环境变量都正确了,但是JAVA_HOME不能识别,导致javac java -version不出现
- 上传本地代码到github
- 压缩/解压封装的类
- KMP算法——C++实现版
- sql server系统表的用法
- 欢迎界面iOS——初学者福利