出处:阮一峰

stack:中文名字叫做"栈"

理解这个概念,对于理解程序的运行至关重要。容易混淆的是,这个词其实有三种含义,适用于不同的场合,必须加以区分。

含义一:数据结构

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

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

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

  • 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是有结构的,每个区块按照一定次序存放,可以明确知道每个区块的大小;heap是没有结构的,数据可以任意存放。因此,stack的寻址速度要快于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也是局部变量,但是类型为指针变量,指向一个对象的实例。指针变量占用的大小是确定的,但是对象实例以目前的信息无法确知所占用的内存空间大小。

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

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

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

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

(完)

Stack的三种含义相关推荐

  1. js基础语法(01)-JS中+号的三种含义

    01-JS中+号的三种含义 (1)数学意义上的相加 : 1 + 1 会得到: 2 (2) 数学意义上的正负号: +5 正数 作用:可以把string类型转换成number类型 (3)字符串的连接符:' ...

  2. 对象的notify方法的含义和对象锁释放的三种情况

    1,notify的含义     (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...

  3. Linux的三种权限含义,Linux chmod命令及权限含义

    对于一条权限赋值命令:sudo chmod  -R 764 ×××:我们必须了解其含义: (1)各字段含义:sudo chmod  -R(更改文件夹及其子文件夹) 7(所有者权限)6(组用户权限)4( ...

  4. 计算机硬盘模式,硬盘三种模式的含义-电脑自学网

    硬盘三种模式的含义. NORMAL(普通模式),是最早的IDE方式.以此方式访问BIOS和IDE控制器对参数不做任何转换.该模式支持的最大柱面数为1024,最大磁头数为16,最大扇区为63,每个扇区字 ...

  5. access的否定形式_“肯定形式”表示“否定含义”三种形式

    在日常交流中,直接的否定在表达情感和观点时显得浅显易懂,尽管它们有的时候并不那么符合语法要求.比如,好久不见(long time no see);或者,没钱什么都不行(no money, no goo ...

  6. 如何高情商回答领导说“辛苦啦”?三层含义三种水平,网友:高看一眼

    网友热议:领导对你说"辛苦啦",如何回答才能情商满分,助力提职加薪?很多职场写手给出了五花八门的答案,思维导图,心理动机,分析得头头是道.关键是看网友留言,嘲讽风声一边倒,尤其是9 ...

  7. SolidWorks草图线条为什么有黑色蓝色红色三种颜色?是什么含义?

    SolidWorks草图线条为什么有黑色蓝色红色三种颜色?是什么含义? 解释: SolidWorks草图绘制时软件会自动识别SolidWorks草图中线条的尺寸和几何关系,不同的草图定义会出现黑色.蓝 ...

  8. 老丁带你学USB-解疑2:USB协议中的ACK、NAK、STALL三种返回包含义

    三种返回确认信息 ACK .NAK .STALL [ACK 包] ACK(确认) 表示 主机和设备已经收到数据,没有出现错误.设备必须在Setup 事务的交换包中返回ACK,设备也必须在OUT事务的交 ...

  9. C++ new 的三种面貌

    C++ 中使用new运算符产生一个存在于 Heap(堆)上的对象时,实际上调用了 operator new()函数和 placement new() 函数.在使用 new 创建堆对象时,我们要清楚认清 ...

  10. 三种创建线程方式之Callable接口

    一.类继承关系及API解析 Callable接口 @FunctionalInterface public interface Callable<V> {V call() throws Ex ...

最新文章

  1. Bazel入门教程:编译C++项目
  2. TorchFusion 是一个深度学习框架,主要用于 AI 系统加速研究和开发
  3. 为什么我的开发方式如此愚蠢?
  4. Ceres Solver Document学习笔记
  5. Eclipse c++ 中[Linker error] undefined reference to `WSAStartup@8'的解决办法
  6. 51nod-1640--天气晴朗的魔法(简单最小生成树)
  7. [delphi]极域学生端解除键盘鼠标锁定退出全屏广播-强制窗口化-源代码
  8. pytorch clamp 与clamp_区别
  9. The _imagingft C module is not installed
  10. Linux教程:10条秘诀确保Linux桌面安全性
  11. Linux之ssh无密码登录
  12. 算法导论第三版第六章 答案
  13. burpsuite2.0破解版使用说明
  14. 【附源码】计算机毕业设计SSM网上汽车租赁系统
  15. 大数据笔记(三):HDFS集群搭建-伪分布式模式
  16. Wed前端开发 ---- HTML超文本标记语言
  17. teamlab什么意思_不好意思,我们的2019毕业季聚会,和前辈的不一样
  18. php获取实时汇率,php获取sinajs股票/汇率/期货实时价格
  19. 云POS连锁版收银系统免费试用 超市连锁收银软件免费注册
  20. 基于Flash播放器的P2P直播解决方案

热门文章

  1. mysql自增步长_mysql实现自增步长调整_数据库,mysql,自增,步长,调整
  2. ubuntu无法进入图形界面,停留在【ok】启动界面
  3. (二)注释(comment)详解
  4. 【电脑讲解】电脑知识入门大全,超详细电脑基础知识讲解
  5. 计算机电缆对绞节距,耐高温双绞计算机电缆DJFFP2√厂家
  6. 最新版本的mmdetection2.0 (v2.0.0版本)环境搭建、训练自己的数据集、测试以及常见错误集合
  7. 外网访问计算机远程桌面掉线,[转载]远程桌面一连就经常掉线的解决方法
  8. DTMF双音多频信号仿真演示系统
  9. 带通滤波器参数详细推导
  10. 精华 | 网络故障排除命令汇总【网工必须收藏】