《程序设计中的Stack详解计算机C资料_计算机-C++资料.pdf》由会员分享,可在线阅读,更多相关《程序设计中的Stack详解计算机C资料_计算机-C++资料.pdf(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 Stack的三种含义 作者:阮一峰 学习编程的时候,经常会看到stack这个词,它的中文名字叫做栈.理解这个概念,对于理解程序的运行至关重要容易混淆的是,这个词其实有 三种含义,适用于不同的场合,必须加以区分.含义一:数据结构 stack的第一种含义是一组数据的存放方式,特点为LIFO,即后进先出(Last in,first out)在这种数据结构中,数据像积木那样一层层堆起来,后面加入的数据就放在最 上层使用的时候,最上层的数据第一个被用掉,这就叫做后进先岀.与这种结构配套的,是一些特定的方法,主要为下面这些.push:在最顶层加入数据.:返回并移除最顶层的数据pop?.:返回最顶层数据的
2、值,但不移除它top?.:返回一个布尔值,表示当前stack是否为空栈isempty?含义二:代码运行 方式 stack的第二种含义是调用栈(call stack),表示函数或子例程像堆.积木一样存放,以实现层层调用.下面以一段JdVd代码为例(来源).class Student int age:String name;public Student int Aga String Name this.age=Age;setName Name public void setName String Name this.name=Name;public class Main public static
3、 void main;String args Student s;s=new Student 23,lonh11);上面这段代码运行的时候,首先调用main方法,里面需要生成一个Student 的实例,于是乂调用Student构造函数在构造函数中,乂调用到setName方法.这三次调用像积木一样堆起来,就叫做调用栈程序运行的时候,总是先完成 最上层的调用,然后将它的值返回到下一层调用,直至完成整个调用栈,返回最 后的结果.含义三:内存区域 stack的第三种含义是存放数据的一种内存区域程序运行的时候,需要内存 空间存放数据一般来说,系统会划分出两种不同的内存空间:一种叫做stack (栈),另
4、一种叫做heap(堆)它们的主要区别是:stack是有结构的,每个区块按照一定次序存放,可以明 确知道每个区块的大小;heap是没有结构的,数据可以任意存放因此,stackprogram start(23!1 John11);至关重要容易混淆的是这个词其实有三种含义适用于不同的场合必须加以区分含义一数据结构的第一种含义是一组数据的存放方式特点为即后进先出在这种数据结构中数据像积木那样一层层堆起来后面加入的数据就放在最上层使用层加入数据返回并移除最顶层的数据返回最顶层数据的值但不移除它返回一个布尔值表示前是否为空栈含义二代码运行方式的第二种含义是调用栈表示函数或子例程像堆积木一样存放以实现层层调
5、用下面以一段代码为例来源上面这调用像积木一样堆起来就叫做调用栈程序运行的时候总是先完成最上层的调用然后将它的值返回到下一层调用直至完成整个调用栈返回最后的结果含义三内存区域的第三种含义是存放数据的一种内存区域程序运行的时候需要内存空的寻址速度要快于heap.其他的区别还有,一般来说,每个线程分配一个stack,每个进程分配一个heap,也就是说,stack是线程独占的,heap是线程共用 的此外,stack创建的时候,大小是确定的,数据超过这个大小,就发生stack overflow错误,而heap的大 小是不确定的,需要的话可以不断增加.根据上面这些区别,数据存放的规则是:只要是局部的、占用
6、空间确定的数据,一般都存放在stack里面,否则就放在he曲里面请看下面这段代码(来源).public void Methodi int i=4;int y=2;classl clsl=new classl;);上面代码的Methodl方法,共包含了三个变量:i,y和clsl.其中,i和y 的值是整数,内存占用空间是确定的,而且是局部变量,只用在Methodl区块之 内,不会用于区块之外clsl也是局部变量,但 是类型为指针变量,指向一个 对象的实例指针变量占用的大小是确定的,但是对象实例以口前的信息无法确 知所占用的内存空间大小.这三个变量和一个对象实例在内存中的存放方式如下 stack 1
7、 Linel public void Method 1()stack 冋 int y=2;classl clsl=new class”);exiting method stack stack 县 Heap clsl(ref)*1 y=21$bjecJ/int i=4;Line2 至关重要容易混淆的是这个词其实有三种含义适用于不同的场合必须加以区分含义一数据结构的第一种含义是一组数据的存放方式特点为即后进先出在这种数据结构中数据像积木那样一层层堆起来后面加入的数据就放在最上层使用层加入数据返回并移除最顶层的数据返回最顶层数据的值但不移除它返回一个布尔值表示前是否为空栈含义二代码运行方式的第二种含
8、义是调用栈表示函数或子例程像堆积木一样存放以实现层层调用下面以一段代码为例来源上面这调用像积木一样堆起来就叫做调用栈程序运行的时候总是先完成最上层的调用然后将它的值返回到下一层调用直至完成整个调用栈返回最后的结果含义三内存区域的第三种含义是存放数据的一种内存区域程序运行的时候需要内存空从上图可以看到,i、y和clsl都存放在stack,因为它们占用内存空间都是 确定的,而且本身也属于局部变量但是,clsl指向的对象实例存放在heap,因 为它的大小不确定作为一条规则可以记住,所有的对象都存放在heap.接下来的问题是,当Methodl方法运行结束,会发生什么事?回答是整个stack被清空,i、
9、y和clsl这三个变量消失,因为它们是局部变 量,区块一旦运行结束,就没必要再存在了.而heap之中的那 个对象实例继续 存在,直到系统的垃圾清理机制(garbage collector)将这块内存回收因此,一般来说,内存泄漏都发生在heap,即某些内存空间不再被使用了,却因为种 种原因,没有被系统回收.至关重要容易混淆的是这个词其实有三种含义适用于不同的场合必须加以区分含义一数据结构的第一种含义是一组数据的存放方式特点为即后进先出在这种数据结构中数据像积木那样一层层堆起来后面加入的数据就放在最上层使用层加入数据返回并移除最顶层的数据返回最顶层数据的值但不移除它返回一个布尔值表示前是否为空栈含义二代码运行方式的第二种含义是调用栈表示函数或子例程像堆积木一样存放以实现层层调用下面以一段代码为例来源上面这调用像积木一样堆起来就叫做调用栈程序运行的时候总是先完成最上层的调用然后将它的值返回到下一层调用直至完成整个调用栈返回最后的结果含义三内存区域的第三种含义是存放数据的一种内存区域程序运行的时候需要内存空