堆和栈

作者: 且行且珍惜_iOS | 来源:发表于2016-03-29 13:30 被阅读213次
  堆和栈的区别主要有以下五点:

  1、管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来讲,释放工作由程序员控制,容易产生memory leak(内存泄露)。

  2、申请大小:

  栈是向低地址扩展的数据结构,是一块连续的内存区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,是一个编译时就确定的常数,如果申请空间超过栈的剩余空间时,将提示overflow(溢出)。因此,能从栈获得的空间较小。

  堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是由链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

  3、碎片问题:

  对于堆来讲,频繁的new、delegate势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出。

  4、分配方式:

  栈有2种分配方式:静态分配和动态分配。静态分配是由编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

  堆都是动态分配的,没有静态分配的堆。

  5、分配效率:

  栈是机器系统提供的数据结构,计算机会在底层对栈提供支持,分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。

相关文章

  • 10.11java中的堆和栈

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

  • 堆和栈

    一 java 堆内存和栈内存 java把内存分为两种:一种是堆内存,一种是栈内存 堆: 堆内存主要存储实例化对象,...

  • 堆和栈

    栈区(stack)由编译器自动分配释放 ,存放方法(函数)的参数值, 局部变量的值等,栈是向低地址扩展的数据结构,...

  • 堆和栈

    堆和栈在内存地址空间中的位置是不一样的,堆向上增长,而栈向下增长;其次,他们的功能也不一样,堆中的空间程序员可以自...

  • 堆和栈

    基本要点 基本数据类型、局部变量都是存放在栈内存中的,用完就消失了。new创建的实例化对象及数组,是放在堆内存中的...

  • 堆和栈

     按管理方式看:oc对象存放于堆里面(堆内存需要程序员手动回收) 非oc对象一般放在栈里面(栈内存会被系统自...

  • 堆和栈

    一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放...

  • 堆和栈

    问题描述 编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅...

  • 堆和栈

    在数据结构中堆和栈都是一种数据项按序排列的数据结构,但我们今天所说的重点并不是数据结构中的堆和栈,而是C语言内存分...

  • 堆和栈

网友评论

    本文标题:堆和栈

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