理解stack栈对于理解程序的执行至关重要。easy混淆的是,这个词事实上有三种含义,适用于不同的场合,必须加以区分。

含义一:数据结构

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

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

与这样的结构配套的是以下几种特定的方法:

(1)push:在最顶层添�数据

(2)pop:返回并移除最顶层的数据

(3)top:返回最顶层数据的值,但不移除它

(4)isempty:返回一个布尔值,表示当前stack是否为空栈。

含义二:代码执行方式

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

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()

{

student s;

s=new student(23,"John");

}

}

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

含义三:内存区域

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

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

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

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

public void Method()

{

int i=4;

int y=2;

class cls1=new class1();

}

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

因此,i、y、cls1都存放在stack,由于它们占用内存空间都是确定的,并且本身也属于局部变量。可是,cls1指向的对象实例存放在heap,由于它的大小不确定。

作为一条潜规则须要记住,全部的对象都存放在heap。

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

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

Stack栈的三种含义的更多相关文章

  1. Stack的三种含义 ----超级经典 明白了 栈 的三种含义

    来自:http://www.ruanyifeng.com/blog/2013/11/stack.html ----------------------------------------------- ...

  2. Stack的三种含义(数据超过栈的大小,就发生stack overflow)

    非常典型的基础知识,转自http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈& ...

  3. Stack的三种含义

    作者: 阮一峰 日期: 2013年11月29日 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈". 理解这个概念,对于理解程序的运行至关重要.容易混淆的是,这个词 ...

  4. Stack的三种含义(转载--阮一峰)

    作者: 阮一峰 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈". 理解这个概念,对于理解程序的运行至关重要.容易混淆的是,这个词其实有三种含义,适用于不同的场合 ...

  5. [转帖]Stack的三种含义

    Stack的三种含义 http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈&q ...

  6. "《算法导论》之‘栈’":栈的三种实现(静态数组、动态数组及指针)

    本文有关栈的介绍部分参考自网站数据结构. 1. 栈  1.1 栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底( ...

  7. 分治FFT的三种含义

    分治FFT是几个算法的统称.它们之间并无关联. 分治多项式乘法 问题如求\(\prod_{i=1}^na_ix+b\). 若挨个乘复杂度为\(O(n^2\log n)\),可分治做这件事,复杂度为\( ...

  8. static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数

    C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域. 从作用域看: 全局变量具有全局作用域.全局变量只需在一个源文件 ...

  9. "《算法导论》之‘队列’":队列的三种实现(静态数组、动态数组及指针)

    本文有关栈的介绍部分参考自网站数据结构. 1. 队列  1.1 队列的定义 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表. (1)允许删除的一端称为队头(Front) ...

随机推荐

  1. 转:.Net程序员学习Linux最简单的方法

    有很多关于Linux的书籍,博客.大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语 ...

  2. Linux 终端部分重要快捷键

    tab  自动补全文件名,目录名或命令名ctrl+c  强行终止当前程序Ctrl+d 键盘输入结束或退出终端 Ctrl+s 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+z 将当前程序放到后台运行 ...

  3. Android经常使用UI组件 - TextView

    TextView是Android里面用的最多的UI组件,一般使用在须要显示一些信息的时候,其不能输入,仅仅能初始设定或者在程序中改动. 实例:TextViewDemo 执行效果: 代码清单: 布局文件 ...

  4. Python类的继承演示样例

    class Pet: __name = "" def __init__(self, name): self.__name = name def bark(self): return ...

  5. tomcat 系统服务 outofmemory

    TOMCAT内存溢出outofmemory的问题: http://hi.baidu.com/mefeng47/item/3b247af74ce4e24e922af2e5 注:双击tomcat6w.ex ...

  6. 【Web】CXF WebService 服务端和客户端 环境搭建及测试

    cxf服务端 1.去官方下载对应的jar包:http://cxf.apache.org/ 2.maven配置相应jar包 3.修改web.xml,完成spring和cxf配置 <!-- Spri ...

  7. 【转载】Java重构示例【1】

    序言 本文通过Java示例代码片段展示了常用重构原则和技巧,供初级开发人员参考.精致的代码能够清楚传达作者的意图,精致的代码是最好的注释,精致的代码非常容易维护和扩展.程序员阅读精致的代码如同大众欣赏 ...

  8. CodeForces 486C Palindrome Transformation 贪心+抽象问题本质

    题目:戳我 题意:给定长度为n的字符串,给定初始光标位置p,支持4种操作,left,right移动光标指向,up,down,改变当前光标指向的字符,输出最少的操作使得字符串为回文. 分析:只关注字符串 ...

  9. BZOJ 1858: [Scoi2010]序列操作( 线段树 )

    略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...

  10. C++创建动态链接库(*.dll)

    1.      从 “文件”菜单中,选择 “新建”,然后选择 “项目…”. 2.      在“项目类型”窗格中,选择“Visual C++”下的“Win32”. 3.      在“模板”窗格中,选 ...