堆栈的认识

  • 1.内存中的堆栈
    • 代码区
    • 静态数据区
    • 栈区
    • 堆区
  • 2.数据结构中的堆栈

内存中的堆栈和数据结构堆栈不是一个概念,可以说内存中的堆栈是真实存在的物理区,数据结构中的堆栈是抽象的数据存储结构。

1.内存中的堆栈

内存空间在逻辑上分为三部分:代码区、静态数据区和动态数据,动态数据区又分为栈区和堆区。

代码区

存储方法体的二进制代码。高级调度(作业调度)、中级调度(内存调度)、低级调度(进程调度)控制代码区执行代码的切换。

静态数据区

存储全局变量、静态变量、常量,常量包括final修饰的常量和String常量。系统自动分配和回收。

栈区

存储运行方法的形参、局部变量、返回值。由系统自动分配和回收。
例如:int method(int a) {int b;} 栈中存储参数a、局部变量b、返回值temp。

int main()
{int b;             //栈char s[] = "abc";     //栈char *p2;            //栈
}

其中函数中定义的局部变量按照先后定义的顺序依次压入栈中,也就是说相邻变量的地址之间不会存在其它变量。栈的内存地址生长方向与堆相反,由高到底,所以后定义的变量地址低于先定义的变量,比如上面代码中变量s的地址小于变量b的地址,p2地址小于s的地址。栈中存储的数据的生命周期随着函数的执行完成而结束。

堆区

new一个对象的引用或地址存储在栈区,指向该对象存储在堆区中的真实数据。由程序员分配和回收(Java中由JVM虚拟机的垃圾回收机制自动回收)。
例如:Class Student{int num; int age;} main方法中Student stu = new Student();分配堆区空间中存储的该对象的num、age,变量stu存储在栈中,里面的值是对应堆区空间的引用或地址。

堆的内存地址生长方向与栈相反,由低到高,但需要注意的是,后申请的内存空间并不一定在先申请的内存空间的后面,即p2指向的地址并不一定大于p1所指向的内存地址,原因是先申请的内存空间一旦被释放,后申请的内存空间则会利用先前被释放的内存,从而导致先后分配的内存空间在地址上不存在先后关系。堆中存储的数据的若未释放,则其生命周期等同于程序的生命周期。

关于堆上内存空间的分配过程,首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。

2.数据结构中的堆栈

栈:是一种连续存储的数据结构,特点是存储的数据先进后出。
堆:是一棵完全二叉树结构,特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。

参考博客: https://blog.csdn.net/K346K346/article/details/80849966

内存中的堆栈和数据结构堆栈区别相关推荐

  1. C++中各个概念的异同与区别

    1.指针与引用的区别 指针有自己的一块空间,而引用只是一个别名 使用sizeof函数,指针大小为4个字节,而引用的大小是被引用对象的大小 指针可以被初始化为NULL,但引用必须是一个对象 作为参数传递 ...

  2. Java中的堆和栈的区别

    当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先 ...

  3. 数据结构的堆栈与内存中堆栈的区别

    随笔 - 20  文章 - 0  评论 - 14 内存堆和栈的区别 原文: http://student.csdn.net/link.php?url=http://www.top-e.org%2Fji ...

  4. 数据结构堆栈 内存堆栈_零堆栈数据科学家第二部分秋天

    数据结构堆栈 内存堆栈 In Hollywood, it is known that the sequels are rarely better than the original movie/par ...

  5. 数据结构和内存中堆和栈的区别

    特别声明:本文参考了博客:http://blog.csdn.net/wolenski/article/details/7951961#comments 堆和栈在 我的眼里一直是很模糊的概念,只是简单的 ...

  6. C语言堆栈入门——与数据结构堆栈区别

    在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念.堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认识 ...

  7. .Net中堆栈和堆的区别

    首先堆栈和堆(托管堆)都在进程的虚拟内存中.(在32位处理器上每个进程的虚拟内存为4GB) 堆栈stack 1.堆栈中存储值类型 2.堆栈实际上是向下填充,即由高内存地址指向低内存地址填充 3.堆栈的 ...

  8. 数据结构堆栈 内存堆栈_了解堆栈数据结构

    数据结构堆栈 内存堆栈 In this article, we'll be understanding the working and the need for the Stack Data Stru ...

  9. C++ 内存中堆栈讲解

    其实我们都知道,计算机内存本来就是一块内存,没有堆栈之分. 堆.栈都是运行程序存放变量和数据的地方. 字符串常量区:存放常量字符串 栈区:存放所有的临时变量和声明 全局常量区:存放定义在函数之外本文件 ...

最新文章

  1. 吴裕雄--天生自然 PHP开发学习:数组
  2. mongodb用户管理简单记录
  3. 百度新闻 谷歌新闻_每日新闻摘要:到目前为止,Google I / O提供的最佳信息
  4. 中小企业上云多地域办公组网,建立高质量云上内网环境
  5. java float 高效加减_java Double 进行加减乘除
  6. SpringBoot精通系列-使用Mybatis Generator生成Dao层代码
  7. 经济学的概念、术语与常识
  8. 25.212---复用和信道编码
  9. toolchain - 工具链
  10. VISA/MasterCard/AE/DC/JCB卡号结构
  11. 中级软件设计师刷题笔记
  12. linux ntfs 3g 格式化,linux使用ntfs-3g操作ntfs格式硬盘
  13. 对“回调函数”的理解
  14. 华三防火墙h3cf100配置双宽带_华三F100系列、华为USG6300系列防火墙 策略路由配置实例...
  15. 如何在游戏中设置游戏的帧率和显示帧率
  16. 沙漠帕拉萨德别墅室内外Corona建筑作品赏析
  17. Spring-Boot Dubbo 整合
  18. TI AWR1642BOOST-ODS EVM开发板入门
  19. 在jsp引入bootstrap
  20. 熊市定投,牛市才有收获

热门文章

  1. 突发!Google 下架拼多多,称存在恶意软件
  2. MySQL 慢查询及SQL执行时间监控
  3. 如何掌握Facebook自动人脸识别技术?
  4. 关于Ubuntu显卡驱动失败产生的一些错误以及解决办法
  5. 写作技巧:如何在word里优雅的插入代码
  6. Java 高内聚,低耦合
  7. 一篇文章发在一个微信上,吸引来3000个代理
  8. 多多客api_编写一个API接口,到底有多多多多多多多简单?
  9. 用processing画李萨如曲线
  10. 中国象棋python的实践报告范文_象棋心得体会范文