精华内容
下载资源
问答
  • 数据结构中的栈和堆,计算机系统内存中的栈和堆的理解
    以下理解仅是个人理解,如有不对还请大家指出。。。。
    首先数据结构中的栈是一种数据结构:
    例如 数据结构中的栈定义如下:
    # define STTACK_INIT_SIZE 100  //栈的初始化空间大小   存放在内存中的数据区(静态变量区)
        typedef struct{                        //结构体在存储时存在文件区,当运行时则存在在栈区,注意这里的栈不是结构体中的栈,而是计算设计内存中的栈。见下面分析
        ElemType * elem;
        int stacksize;
        int top;
    }
    数据结构中的堆是树的一种。

    计算机系统内存中的栈和堆:
    计算机系统在程序运行时会将程序映射到内存中,其中运行时分为5个区:栈区、堆区、(bass区、数据区)、代码区
    栈区用于存放局部变量,临时变量,传递到函数中的参数,是系统自动分配的。
    堆区用于动态分批内存  
    这几个区的详细介绍见我转载的三篇博文。相信你看后会对栈区和堆区有更深入的了解。

    也就是说数据结构中的栈和堆反应的是你设计程序时一种数据之间的额关系的体现
    而计算设计系统中内存的堆和栈是在程序运行过程中计算机用于分配资源的两个区域。
    展开全文
  • 通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间; 而通过new关键字和构造器创建的对象放在堆空间; 程序中的字面量(literal)如直接书写的100、“hello”...

    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net

    通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;

    而通过new关键字和构造器创建的对象放在堆空间;

    程序中的字面量(literal)如直接书写的100、“hello”和常量都是放在静态区中。

    栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。

    String str = new String( "hello" );

    上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上,而“hello”这个字面量放在静态区中。

    补充:较新版本的Java(从Java 6的某个更新开始)中使用了一项叫”逃逸分析”的技术,可以将一些局部对象放在栈上以提升对象的操作性能。

    展开全文
  • 数据结构中的栈和堆(堆栈) 首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。 堆和栈都是一种数据项按序排列的数据结构。 栈就像弹夹,先装进去的最后出来,FILO(First in...

    首先要明确一点,这两个东西是八竿子打不着的东西,他俩没啥关系

    数据结构中的栈和堆(堆栈)

    首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。
    堆和栈都是一种数据项按序排列的数据结构。

    栈就像弹夹,先装进去的最后出来,FILO(First in last out)。

    堆像一棵倒过来的树,堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。

    内存中的栈和堆

    1.申请方式

    stack(栈区):有系统自动分配。例如:在函数中声明一个局部变量int b;系统将自动在栈区为b开辟内存空间,由系统释放。

    heap(堆区):需要程序员自己申请,并指明大小,由程序员自己释放。

    2.申请后系统的响应

    栈:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将报异常,栈溢出。

    堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到申请时,会遍历链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序,一般是在堆的头部用一个字节存放堆的大小。由于找到的堆节点的大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放入空闲链表中。

    3.申请大小的限制

    栈:在windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域,栈的大小是2M,因此,能从栈获得的空间较小。所以用子函数还是有物理意义的。

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

    4.申请效率比较

    栈:有系统自动分配,速度较快,但程序员无法控制。

    堆:由malloc(),new()分配的内存,速度较慢,并且容易产生内存碎片。

    5.存取效率比较

    char str1[] = "aaa";

    char *str2 = "bbb";

    其中aaa是在运行时刻进行赋值的,存放在栈中,bbb是在编译时就确定了,放在堆中,在以后的存取中,数组(堆区)快于(指针)栈区。

    
       int a = 0; //全局初始化区
       char *p1;  //全局未初始化区
       int main()
       {
           int b; //栈
           char s[] = "abc";//栈
           char *p2; //栈
           char *p3 = "123456"; 123456\0 //在常量区,p3 在栈区
           static int c = 0; //全局(静态)初始化区
           p1 = (char *)malloc(10);//堆
           p2 = (char *)malloc (20);//堆
       }

    关于堆和栈区的比喻
      使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。

    使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。比喻很形象,说的很通俗易懂。

    https://blog.csdn.net/Fiorna0314/article/details/49757195

    https://blog.csdn.net/wolenski/article/details/7951961#comments

    展开全文
  • 通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、“hello”和...
    通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、“hello”和常量都是放在静态存储区中。栈空间操作最快但是也很小,通常大量的对象都是放在堆空间,整个内存包括硬盘上的虚拟内存都可以被当成堆空间来使用。
    

    String str = new String(“hello”);

    上面的语句中str放在栈上,用new创建出来的字符串对象放在堆上,而“hello”这个字面量放在静态存储区。

    补充:较新版本的Java中使用了一项叫“逃逸分析“的技术,可以将一些局部对象放在栈上以提升对象的操作性能。
    展开全文
  • 通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的 现场保存 都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、”hello”和...
  • Java面试题:解释内存中的栈(stack)、堆(heap)和静态存储区的用法 堆区: 专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的...
  • JavaJVM的内存可分为3个区:堆(heap)、(stack)和方法区(method) 堆区: 1.存储全部是对象,每个对象都包含一个与之对应class信息。(class目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆...
  • (1)定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间; (2)通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都...
  • 静态区(常量区):程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在静态区中 空间操作起来最快但是很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘...
  • 通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间;而通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都...
  • 堆区:专门用来保存对象实例(new 创建对象和数组),实际上也只是保存对象实例属性值,属性类型和对象本身类型标记等,并不保存对象方法(方法是指令,保存在Stack)1.存储全部是对象,每个对象都包含...
  • 数据结构中的堆与栈: 栈:是一种连续储存的数据结构,具有先进后出的性质。通常的操作有入栈(圧栈)、出栈和栈顶元素。想要读取栈中的某个元素,就要将其之前的所有元素出栈才能...内存中的栈区与堆区: 一般说到...
  • 基础知识篇——堆内存栈内存

    万次阅读 多人点赞 2018-11-01 09:05:00
    数据结构中的堆和栈 栈 是一种连续储存的数据结构,具有先进后出的性质。 通常的操作有入栈(压栈),出栈和栈顶元素。想要读取栈中的某个元素,就是将其之间的所有...内存中的栈区与堆区 Stack memory内存空间由操...
  • 内存中堆和栈的区别

    千次阅读 2019-02-19 16:39:41
    JVM运行时在内存中开辟一片内存区域,启动时在自己内存区域中进行更细致划分,因为虚拟机中每一片内存处理方式都不同,所以要单独进行管理。 JVM内存划分有五片: 寄存器; 本地方法区; 方法区; 内存;...
  • JS中对象分为基本类型和引用类型,基本类型存放在内存,引用类型存放在堆内存。请问内存和堆内存区别是什么,为什么这两种对象分别存储在不同的内存中
  • 内存中栈和堆作用和区别

    千次阅读 2019-02-26 17:16:49
    首先内存中的堆栈和数据结构中的堆栈是不同的两个东西。 内存中分为和堆,以及静态存储区、程序代码区等。   内存模型:   从空间上和存放内容上来说: :内存空间小一些,的内存要远远小于堆内存,...
  • 内存中的堆和

    千次阅读 2017-11-27 20:51:32
    是你电脑内存的一个特别区域,它用来存储被每一个function(包括mian()方法)创建临时变量。是FILO,就是先进后出原则结构体,它密切被CPU管理和充分利用。每次function声明一个新变量,它就会被...
  • 内存中堆和栈的解释

    2016-04-07 18:44:14
     在函数定义的一些基本类型的变量和对象的引用变量都在函数的栈内存 分配。  当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放 掉为该变量所分配...
  • 内存中堆和的区别:Heap&&Stack 参考:http://www.cnblogs.com/shan1393/p/8996236.html#4038359 六、Java内存模型(此人是大神中的极品) 堆 存放 对象和数组, 是GC主要操作的区域 由于堆是动态分配...
  • 内存分配中的栈和堆

    千次阅读 2014-03-11 00:06:11
    NOTE: 是系统自动分配空间的,例如我们定义一个 char a...下图是APUE中的一个典型C内存空间分布图: BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Sy
  • JAVA中的栈内存和堆内存

    千次阅读 2012-10-10 19:00:45
    在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存...
  • JS的内存空间分为(stack)、堆(heap)、池(一般也会归类为栈中)。 其中存放变量,堆存放复杂对象,池存放常量,所以也叫常量池。 数据结构 是一种特殊列表,元素只能通过列表一端访问,这一端称为...
  • 其操作方式类似于数据结构中的栈。 2、堆区(heap)一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区)(stati
  • Java中的栈内存与堆内存

    千次阅读 2009-10-24 21:27:00
    在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存...
  • 当我们在用C++做底层驱动时候,经常会遇到内存不足警告,究其原因,往往是因为内存出现溢出,泄露或者越界等原因。那么他们之间有什么联系吗?  内存溢出(out of memory) 是指程序在申请内存时,没有足够...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,861
精华内容 20,344
关键字:

内存中的栈