精华内容
下载资源
问答
  • 内存中堆栈和数据结构堆栈区别

    千次阅读 2019-06-26 16:43:19
    内存中堆栈和数据结构堆栈不是一个概念,可以说内存中堆栈是真实存在的物理区,数据结构堆栈是抽象的数据存储结构。 1.内存中堆栈 内存空间在逻辑上分为三部分:代码区、静态数据区和动态数据,动态数据区...


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

    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

    展开全文
  • 简单理解内存中堆栈与数据结构堆栈

    一日中午,平静的办公室忽然发出这样一个声音:什么是堆栈?
    于是瞬间,办公室开始闹腾起来
    A:堆栈就是后进后出
    B:堆就是时间牺牲空间,栈就是空间牺牲时间
    C:栈更快,堆就略微慢一点
    D:……
    作为刚毕业的码畜,听完之后就有些懵逼了(WTF,堆栈还有这么多东西吗?),于是上网搜寻各种资料,发现了一个在大学知识容易混淆的知识点,那就是——数据结构中的堆栈与内存中的堆栈存储是不同的


    数据结构中的堆栈

    先说数据结构中的堆栈,这个就是我们大学课程《数据结构》中所学到的,通俗上的堆栈的理解,堆和栈是数据存储方式的两种数据结构。关于堆栈,其实还有一个比较容易搞混的地方那就是队列,其实这三种都是数据结构中的一种排序数据结构
    - :堆的数据机构其实就是一个完全二叉树,具堆属性的数据结构才可被叫做为堆,堆常见的应用就是堆排序与实现优先队列,为什么用?因为快啊
    - 队列:就是先进先出的存储方式,类似与超市付款,先买的先走,一般与栈作比较
    - :与队列相反,栈的顺序是后进先出,只可以在栈顶进行操作,类似与只有一个出入口的公交车,先上车的只能后来下车
    速度
    队列与栈速度相对来说,队列的更快些,因为设计增加删除的操作时,队列不需要改变数据结构,而栈需要,所以遍历速度略低些,这些数据结构一般跟算法有点关系,其实平时敲代码用不到的好不

    以上就是数据结构中的堆栈,接下来说下内存中的堆和栈

    内存中的堆和栈

    在内存中的堆栈,一般指的是数据操作的存在位置,一般来说,栈是存放一些常量字面量一类的东西,这些一般有系统自己控制空间的开辟与释放,而堆是存放一些实例的变量,程序员需要自己去控制何时在内存中分配空间和何时释放(当然,这个也跟语言有关系,java就由虚拟机自行控制,c++就不行了)
    速度
    关于速度,查阅资料,栈的存储一般位于一级缓存,堆的存储位于二级缓存,所以栈的速度是远远大于堆的。(关于一级缓存二级缓存的速度差异请看这个:http://www.to8to.com/yezhu/v9652.html
    什么是堆栈溢出
    堆栈溢出就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了别的数据。意思就是,假如你在内存分配了8大小,而传入的值却大于这个长度,那么多余的长度就可能会覆盖内存中的其他元素,所以会得到错误的返回结果。堆栈溢出一般指的是堆溢出,栈溢出的情况比较少。


    前端新手,弱鸡一枚,如有错误,请指正,谢谢!

    展开全文
  • 相信很多像我外行进入IT的童鞋们一定会对某些专业知识感到困惑,例如数据结构的堆栈和我们编程常说的内存堆栈究竟是怎么回事,有什么区别,下面是我个人在网上学习或捕获到的一些干货,供大家参考:新手上路,如有...

    相信很多像我外行进入IT的童鞋们一定会对某些专业知识感到困惑,例如数据结构中的堆栈和我们编程常说的内存堆栈究竟是怎么回事,有什么区别,下面是我个人在网上学习或捕获到的一些干货,供大家参考:

    新手上路,如有错漏,请轻喷。

    数据结构中的堆栈:是两种特殊的数据结构,都是对数据项按序排列的数据结构,对管理数据的一种手段和方法。可以用来存放数据和地址,栈只能在一端(栈顶)对数据项进行插入和删除。

    内存中的堆栈是确切存在的物理结构,是用来存放不同数据的内存空间。内存中的栈,是由系统自动分配和释放的,是由高地址向低地址扩展的数据机构,是一段连续的内存区域,是对数据结构中的栈这种手段的实现。栈的顶地址和最大容量是系统预先设定好的,在程序编译时,它就是一个确定的常数,但注意并不是所有用到栈技术的区域都是栈区,虽然目前是这样,这是概念定义的准确性问题。 内存中堆,一般用来动态分配内存的,它的实现跟操作系统和编译器有关,一般内存中的堆貌似是用链表实现的。

    内存中的堆:队列优先,先进先出。向高地址扩展的数据结构,是不连续的内存区域,在操作系统中,一般是由程序员动态分配释放的,分配方式:操作系统有一个专门存储空闲地址的链表,当程序申请分配空间时,OS会遍历这个链表(遍历方向:低地址向高地址),找到第一个大于申请的空间的堆节点,并从空闲节点列表中删除该节点,把空间分配给程序,若找到的空间比申请的空间要大,系统会自动把多余的那部分重新放入空闲链表中。一般来说,操作系统会在内存的首地址处记录分配的空间大小,以便程序能够正确地释放该内存空间。堆的大小取决于计算机有效的虚拟内存。

    虚拟内存:利用部分的硬盘空间充当内存使用。由于程序运行是所需内存(随机存储器RAM)过大,会导致内存消耗殆尽,系统会自动调用硬盘空间充当内存,缓解内存紧张。RAM空间匮乏时,可以增加虚拟内存来进行补偿。当计算机从RAM中读取数据的速度一般比硬盘快,所以想要程序的运行速度更快,最直接的是加内存条,RAM越大,程序运行越快。

    内存中的栈:由操作系统自动分配释放 ,存放函数的参数值局部变量的值等。其操作方式类似于数据结构中的栈先进后出。它是由高地址向低地址扩展的数据机构,是一段连续的内存区域,只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出

    新手上路,若有错漏,请多多赐教。
    展开全文
  • 它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入...
    堆栈是一种执行“后进先出”算法的数据结构。 

    堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减 1。这个过程叫做“弹出pop”。如此就实现了后进先出的原则。

    最基本的操作方式 就是 入栈和出栈





    后进先出?堆栈数据的进出原则是什么?
    后进先出  或 先进后出

    转载于:https://www.cnblogs.com/tanr-study/p/4601746.html

    展开全文
  • 一文详解堆栈(二)——内存堆与内存

    千次阅读 多人点赞 2019-10-15 19:06:15
    前言:我们经常听见一个概念,堆(heap)和栈(stack),其实在数据结构也有同样的这个概念,但是这和内存堆栈是不一样的东西哦,本文也会说明他们之间的区别的,另外,本文的只是是以C/C++为背景来说明,不同...
  • 堆栈内存分配

    千次阅读 2017-10-31 20:33:50
    如图一所示,在计算机,主要分为以上存储区域,分别是:硬盘、内存、高级缓存 和寄存器。执行程序后,他们的运行速率自下而上(图一)加快,与之相应的造价越高,其中,硬盘的运行效率最慢,寄存器的效率最快。...
  • 内存中堆栈的理解

    千次阅读 2015-04-15 14:08:14
    在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。 要点: 堆:顺序随意 栈:先进后出 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++...
  • 数据结构的堆栈内存中堆栈

    千次阅读 2015-05-06 19:36:05
    内存中堆栈和数据结构堆栈并非一个概念 操作系统的堆栈、数据结构的堆栈内存堆栈 内存堆栈其实就是程序的堆栈,用java、c、c++举例 ==============华丽分割线==================== 数据结构: ...
  • JAVA中堆栈内存分配原理

    千次阅读 2015-11-30 18:28:13
    JAVA中堆栈内存分配原理 博客分类:  需学习 Java基础 1、栈、堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,...
  • 内存中堆栈

    千次阅读 2012-11-12 13:01:58
    一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。...注意它与数据结构的堆是回事,分配方式倒是类似于链表。 3、全局
  • 简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存。 在函数定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存...
  • JavaScript:堆栈溢出&&内存泄漏

    千次阅读 多人点赞 2019-11-26 17:51:23
    在JavaScript,会有听到两个概念:堆栈溢出和内存泄漏,这两种机制在开发遇到的不多,但是一旦碰到就很头疼。下面就分别来讲述一下二者的概念,触发原因以及解决办法。 堆栈溢出: 什么是堆栈溢出?我们知道JS...
  • 汇编堆栈平衡的几种方式

    千次阅读 2017-05-02 10:38:08
    在使用高级语言编程时,源程序使用的函数调用、局部变量都要用到堆栈,由编译器来负责生成有关的机器指令。我的理解,堆栈就是维护当前线程运行状态的一个数据结构,这种状态包括:需要传递的变量,函数的返回...
  • Java内存堆栈分析

    万次阅读 2016-07-03 21:15:35
    2.栈(堆栈,stack):存放基本类型的变量数据和对象的引用(包括字符串对象的引用,因为String是类),但对象本身不存放在栈,而是存放在堆(new 出来的对象,除String对象)或者常量池(String常量对象存放在常量池...
  • 内存中堆栈与数据结构中堆栈

    千次阅读 2013-09-09 21:32:33
    内存中堆栈与数据结构堆栈,以前一直被这困扰着,不知道的时候还以为是同一个东西呢。等看一些资料后,发现原来二者并不是同一概念。现将一些特点记录如下,如有不正之处,还望看到的童鞋指正,谢谢。  首先,...
  • 堆栈寻址方式

    千次阅读 2017-05-10 01:14:16
    关于堆栈结构,计算机常用的有两种,一种是串联堆栈结构,另一种是存储器堆栈结构,下面详细介绍一下这两种堆栈结构。串联堆栈结构串联,字面意思来讲,就是将一系的东西连起来,形成一个串式结构,而在
  • C语言内存模型详细介绍_堆栈介绍

    千次阅读 多人点赞 2018-05-22 18:31:28
    (命令行参数区其实就是在通过dos或shell脚本调用时传递的参数,比如:a.exe 123 123)上图是C语言内存模型,其实虽然说叫C语言内存模型,其实并不是叫C语言内存模型,而是C语言根据CPU处理器搭建出来的一个模型!...
  • 说说STM32的堆栈内存

    万次阅读 多人点赞 2018-08-01 21:20:20
    这里所说的堆栈,是针对单片机所说的“堆”与“栈”,指的是内存中一片特殊用途的区域。而不是数据结构堆栈(虽然其实规则一样)。 这里所说的内存,是指RAM,RAM包括SRAM,DRAM等。而不是什么手机内存卡之类。 ...
  • 编译后程序运行时在内存中堆栈分布,局部变量、全局变量、堆、堆栈、静态和全局
  • 堆栈中分配内存空间

    千次阅读 2014-03-24 12:01:32
    1.申请方式  stack:   由系统自动分配。 例如,声明在函数一个局部变量 int b; 系统自动在栈中为b开辟空间  heap:   需要程序员自己申请,并指明大小,在cmalloc函数  
  • arm堆栈的增长方式

    千次阅读 2016-07-20 08:43:56
    arm堆栈指针,满递减栈,空递减栈
  • C# 深入理解堆栈、堆在内存中的实现

    万次阅读 多人点赞 2016-12-01 14:12:46
    尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(GarbageCollection),但是我们还是应该了解它们,以优化...在本文我将讲解栈和堆的基本知识,变量类型以及为什么一些变量能够按照它们自己的方式工作。
  • C语言申请内存堆栈大小限制

    千次阅读 2018-03-06 19:14:08
    一直都有一个疑问,一个进程可以使用多大的内存空间,swap交换空间以及物理内存...第二种malloc,那么在Linux下,这两种方式可以开辟多大的内存空间呢?下面依次进行实验: 第一种方式:使用malloc申请内存; 这
  • 计算机组成原理

    万次阅读 多人点赞 2019-06-02 14:13:55
    主要两个层次:cache和主存、主存和辅存,其实这两种分层方式都是为了服务于主存从而提高计算机整体的存取速度。 11、三级存储器层次结构 (1)主存(Main Memory):存储当前需要执行的程序和数据,直接与CPU通信。 ...
  • 程序的内存分配   一个由C/C++编译的程序占用的内存分为以下几个部分   1、栈区(stack)  由编译器自动分配释放 ,存放函数的参数值,局部变量的值等...与数据结构的堆是回事,分配方式倒是类似于链表。
  • byte:Java最小的数据类型,在内存中占1个字节(8 bit),取值范围-128~127,默认值0 short:短整型,2个字节(16 bit),取值范围-32768~32717,默认值0 int:整型,用于存储整数,在内存中占4个字节,取值...
  • 计算机堆栈

    千次阅读 多人点赞 2020-06-20 21:49:06
    堆栈基本内容 1、堆栈的定义 • 堆栈是一个特定的存储区或寄存器,它的一端是固定的(栈底...• 在内存储器(随机存储器)开辟一个区域作为堆栈,叫软件堆栈;用寄存器构成的堆栈,叫硬件堆栈。 • 单片机应用,堆
  • 计算机复试面试题总结

    万次阅读 多人点赞 2019-03-07 20:06:56
    面试问题之编程语言 1。C++的特点是什么? 封装,继承,多态。支持面向对象和面向过程的开发。...被virtual修饰的成员函数,再基类不能实现,而他的实现放到派生类实现。 5.什么是内存泄漏? 没有de...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 193,027
精华内容 77,210
关键字:

内存中堆栈的两种方式