美文网首页
内存分配:堆与栈

内存分配:堆与栈

作者: geaus | 来源:发表于2016-05-10 22:13 被阅读0次

程序运行时,涉及操作的内存的类别有:
栈区(stack) : 由编译器自动分配释放,存放函数的参数值,局部变量的值。
堆区(heap) : 一般由程序员分配和释放,若程序员不释放,程序结束后由系统回收。
全局区,也叫静态区(static) : 存储全局变量和静态变量,初始化的在一块区域,未初始化的在另一块,程序结束后由系统回收。
文字常量区,也叫数据段:常量字符串就是放在这里,程序结束后系统回收。
程序代码区,也叫代码段:存放程序的二进制代码。

堆和栈:

  1. 申请方式
    栈是系统自动分配的,堆需要程序员自己申请,并指明大小。
  2. 申请后系统的响应
    栈的话,只要栈的剩余空间大于申请空间,则分配内存,否则将报异常提示栈溢出。
    堆的话,系统将遍历记录空闲内存地址的链表,找到第一个空间大于申请空间的内存块分配给程序,并在内存块的首地址记录本次分配的大小,这样delete才能正确释放内存。另外,多余的内存会重新加入空闲内存链表。
  3. 申请大小限制
    栈,在windows中,由于是向低地址生长的,是一块连续的内存区域。并且栈顶的地址和栈的最大容量是系统预先规定好的。在windows中,栈的大小是2MB,因此申请的空间是有限的。
    堆,则是向高地址生长的,是不连续的内存区域,大小受限于计算机中的空闲内存块大小。堆获得的空间比较灵活,也比较大。
  4. 申请效率
    栈是系统自动分配,速度较快。
    堆的速度较慢,且容易产生内存碎片。
  5. 存储的内容
    栈,函数调用时,首先进栈的是函数的下一条指令,然后是函数的参数,注意参数是从右向左进栈,然后是函数的局部变量,函数中的静态变量不进栈。
    堆,首先在堆的头部存放堆的大小。然后由程序员决定其中的内容。
  6. 存取效率
char s1[]="aaaa";
char *s2="aaaa";

第一行是在运行时赋值,即先定义一个数组s1然后为数组赋值,"aaaa"存放于栈中;第二行则是在编译时赋值,"aaaa"存放于文字常量区。
栈的存取速率比堆快,所以之后s1的存取比s2快。

相关文章

  • Swift 中的内存分配情况与优化思路

    Allocation 内存分配 内存分配可以分为堆区栈区,在栈的内存分配速度要高于堆,结构体和类在堆栈分配是不同的...

  • 内存分配:堆与栈

    程序运行时,涉及操作的内存的类别有:栈区(stack) : 由编译器自动分配释放,存放函数的参数值,局部变量的值。...

  • JS 堆栈

    堆是堆内存的简称,栈是栈内存的简称。 堆是动态分配内存,内存大小不一,也不会自动释放。栈是自动分配相对固定大小的内...

  • 关于JS的堆和栈的理解

    一、堆(heap)和栈(stack) 栈(stack)会自动分配内存空间,会自动释放。堆(heap)动态分配的内存...

  • Java 堆/栈 GC相关

    一、Java程序运行时的内存分配策略 静态分配[静态存储区]/栈分配[栈区]/堆分配[堆区] 1)静态存储区...

  • jvm 基础篇-(2)- 对象分配及回收♻️(-XX:-Hand

    对象分配规则 堆内存: 分配策略: 1、jvm内存宏观分配策略 虚拟机栈分配<<<<<传送门 2、堆内分配策略 1...

  • js 浅拷贝和深拷贝

    堆和栈 栈(stack)为自动分配内存空间,它由系统自动释放。堆(heap)则是动态分配内存,大小不定也不会自动释...

  • Java内存分配---堆与栈

    堆和栈的概念接触已久,也很容易让人似懂非懂。本文阐述它们的区别和作用。配合一个小例子,加深对其理解。 堆内存 堆内...

  • 理解js里堆和栈的意义

    一、 堆(heap)和栈(stack) 栈(stack)会自动分配内存空间,会自动释放。堆(heap)动态分配的内...

  • Android性能优化之常见的内存泄漏

    内存泄漏 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配,...

网友评论

      本文标题:内存分配:堆与栈

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