Stack的三种含义

学习编程的时候。常常会看到stack这个词,它的中文名字叫做"栈"。

理解这个概念。对于理解程序的执行至关重要。

easy混淆的是,这个词事实上有三种含义,适用于不同的场合。必须加以区分。

含义一:数据结构

stack的第一种含义是一组数据的存放方式,特点为LIFO。即后进先出(Last in, first out)。

数据结构stack

在这样的数据结构中,数据像积木那样一层层堆起来。后面增加的数据就放在最上层。使用的时候,最上层的数据第一个被用掉,这就叫做"后进先出"。

与这样的结构配套的,是一些特定的方法。主要为以下这些。

  • push:在最顶层增加数据。

  • pop:返回并移除最顶层的数据。
  • top:返回最顶层数据的值,但不移除它。
  • isempty:返回一个布尔值。表示当前stack是否为空栈。

含义二:代码执行方式

stack的另外一种含义是"调用栈"(call stack),表示函数或子例程像堆积木一样存放,以实现层层调用。

以下以一段Java代码为例(来源)。


class Student{
    int age;              
    String name;      

    public Student(int Age, String Name)
    {
        this.age = Age;
        setName(Name);
    }
    public void setName(String Name)
    {
        this.name = Name;
    }
}

public class Main{
    public static void main(String[] args) {
            Student s;           
            s = new Student(23,"Jonh");
    }
}

上面这段代码执行的时候,首先调用main方法。里面须要生成一个Student的实例。于是又调用Student构造函数。

在构造函数中,又调用到setName方法。

调用栈

这三次调用像积木一样堆起来,就叫做"调用栈"。程序执行的时候。总是先完毕最上层的调用。然后将它的值返回到下一层调用,直至完毕整个调用栈,返回最后的结果。

含义三:内存区域

stack的第三种含义是存放数据的一种内存区域。程序执行的时候,须要内存空间存放数据。一般来说,系统会划分出两种不同的内存空间:一种叫做stack(栈)。还有一种叫做heap(堆)。

内存区域stack

它们的主要差别是:stack是有结构的。每一个区块依照一定次序存放,能够明白知道每一个区块的大小;heap是没有结构的,数据能够随意存放。因此。stack的寻址速度要快于heap。

内存区域heap

其它的差别还有。一般来说,每一个线程分配一个stack,每一个进程分配一个heap。也就是说。stack是线程独占的,heap是线程共用的。

此外。stack创建的时候,大小是确定的,数据超过这个大小,就发生stack overflow错误,而heap的大小是不确定的。须要的话能够不断添加。

依据上面这些差别,数据存放的规则是:仅仅要是局部的、占用空间确定的数据,一般都存放在stack里面,否则就放在heap里面。

请看以下这段代码(来源)。


public void Method1()
{
    int i=4;

    int y=2;

    class1 cls1 = new class1();
}

上面代码的Method1方法,共包括了三个变量:i, y 和 cls1。

当中,i和y的值是整数,内存占用空间是确定的。并且是局部变量,仅仅用在Method1区块之内,不会用于区块之外。cls1也是局部变量,可是类型为指针变量。指向一个对象的实例。指针变量占用的大小是确定的,可是对象实例以眼下的信息无法确知所占用的内存空间大小。

这三个变量和一个对象实例在内存中的存放方式例如以下。

内存空间stack实例

从上图能够看到,i、y和cls1都存放在stack。由于它们占用内存空间都是确定的。并且本身也属于局部变量。可是,cls1指向的对象实例存放在heap,由于它的大小不确定。作为一条规则能够记住,全部的对象都存放在heap。

接下来的问题是。当Method1方法执行结束,会发生什么事?

回答是整个stack被清空,i、y和cls1这三个变量消失,由于它们是局部变量,区块一旦执行结束,就不是必需再存在了。而heap之中的那个对象实例继续存在。直到系统的垃圾清理机制(garbage collector)将这块内存回收。因此。一般来说,内存泄漏都发生在heap,即某些内存空间不再被使用了,却由于种种原因,没有被系统回收。

原文地址:https://www.cnblogs.com/wgwyanfs/p/6727134.html