Stack的三种含义

摘要:
Isempty:返回一个布尔值,指示当前堆栈是否为空。它们之间的主要区别是:堆栈是结构化的,每个块以一定的顺序存储,每个块的大小可以清楚地知道;堆没有结构,数据可以随意存储。因此,堆栈的寻址速度比堆快。

转载: http://kb.cnblogs.com/page/194507/

含义一:数据结构

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

数据结构stack

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

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

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

  含义二:代码运行方式

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

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

Stack的三种含义第2张

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

Stack的三种含义第3张

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

  含义三:内存区域

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

内存区域stack

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

内存区域heap

  其他的区别还有,一般来说,每个线程分配一个stack,每个进程分配一个heap,也就是说,stack是线程独占的,heap是线程共用的。此外,stack创建的时候,大小是确定的,数据超过这个大小,就发生stack overflow错误,而heap的大小是不确定的,需要的话可以不断增加。

  根据上面这些区别,数据存放的规则是:只要是局部的、占用空间确定的数据,一般都存放在stack里面,否则就放在heap里面。请看下面这段代码(来源)。

Stack的三种含义第6张

  上面代码的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,即某些内存空间不再被使用了,却因为种种原因,没有被系统回收。

免责声明:文章转载自《Stack的三种含义》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇memcpy的使用方法总结cascade 介绍与用法 ( oracle)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(转载)linux中shell变量

(转载)http://blog.csdn.net/zahuopuboss/article/details/8633891 为使shell编程更有效,系统提供了一些shell变量。shell变量可以保存诸如路径名、文件名或者一个数字这样的变量名。shell将其中任何设置都看做文本字符串。有两种变量,本地和环境。严格地说可以有4种,但其余两种是只读的,可以认为...

Stata—变量名称、描述和列举变量、标签使用、基本统计

1.变量名称 基本规则:由英文字母、数字或者_组成;需以英文字母或者_作为开头,区分大小写。 举例合理名称:a1 ,a_1,_a1 注意事项:“_”一般不作为首字母(因许多内部变量由“_”加字母组成,避免混淆) 2.查看资料命令 describe(可简写为des):查看所有变量的结构,如何时建立数据库,变量名称,储存类型,变量的显示格式,变量标签等 des...

pycharm快捷键,变量,字符串,类型的操作方法

1.pycharm快捷键的使用。 ctrl(command) + c 复制,默认复制整行 ctrl + v 粘贴 ctrl + z 撤销 ctrl + x 剪切,默认剪切整行 ctrl + a 全选 ctrl + f 查找;选中批量修改 shift + ctrl + z 反撤销 ctrl + d 复制粘贴选中内容,没有选中默认整行 ctrl + bac...

【转好文】c程序员学习perl

给C程序员的提示 Perl结合了多种编程语言的特性,C语言也在其中。Perl和C有以下相同之处: ·1.分号是每个简单语句必需的,换行不能表示语句结束。 ·2.数组下标也是从0开始,Perl中像substr这样的字符串函数也是从0开始计算位置的。 ·3.逗号操作符的作用一样。 ·4.&&和||操作符作用一样。然而,Perl和C毕竟是两...

Java10 新特性

一、JDK10 发布   2018年3月21日, Oracle官方宣布Java10正式发布。   需要注意的是 Java 9 和 Java 10 都不是 LTS (Long-Term-Support) 版本。和过去的 Java 大版本升级不同,这两个只有半年左右的开发和维护期。而未来的 Java 11,也就是 18.9 LTS,才是 Java 8 之后第一个...

Debug 和 Release 编译方式的本质区别

一、Debug 和 Release 编译方式的本质区别       Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。       Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别...