理解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. android handler工作原理

    android handler工作原理 作用 便于在子线程中更新主UI线程中的控件 这里涉及到了UI主线程和子线程 UI主线程 它很特别.通常我们会认为UI主线程将页面绘制完成,就结束了.但是它没有. ...

  2. Windows Phone 8初学者开发—第10部分:数据绑定应用程序和透视应用程序项目模板简介

    原文 Windows Phone 8初学者开发—第10部分:数据绑定应用程序和透视应用程序项目模板简介 原文地址: http://channel9.msdn.com/Series/Windows-Ph ...

  3. IT第十九天 - 继承、接口、多态、面向对象的编程思想

    IT第十九天 上午 继承 1.一般情况下,子类在继承父类时,会调用父类中的无参构造方法,即默认的构造方法:如果在父类中只写了有参的构造方法,这时如果在子类中继承时,就会出现报错,原因是子类继承父类时无 ...

  4. linux内核源码阅读之facebook硬盘加速flashcache之三

    上一节讲到在刷缓存的时候会调用new_kcahed_job创建kcached_job,由此我们也可以看到cache数据块与磁盘数据的对应关系.上一篇:http://blog.csdn.net/lium ...

  5. Android 一个绚丽的loading动效分析与实现!

    http://blog.csdn.net/tianjian4592/article/details/44538605 前两天我们这边的头儿给我说,有个 gif 动效很不错,可以考虑用来做项目里的loa ...

  6. 聊聊高并发(二十五)解析java.util.concurrent各个组件(七) 理解Semaphore

    前几篇分析了一下AQS的原理和实现.这篇拿Semaphore信号量做样例看看AQS实际是怎样使用的. Semaphore表示了一种能够同一时候有多个线程进入临界区的同步器,它维护了一个状态表示可用的票 ...

  7. stm32基础入门

    1.开发工具,初学者建议MDK,后期ivr 2.寄存器开发or库 版本开发:先寄存器开发,后期两者结合: 3.软件仿真or开发板,先软件仿真,后期两者结合: 建立工程: 1.包含三部分:start.u ...

  8. git 使用过程(三、文件的添加 修改)

    1.库中添加文件 在目录下新建一个文件 如 testfile.txt .输入命令:① git add testfile.txt  ②git commit -m "这里是你提交的说明" ...

  9. Checkbox in DataList

    一,效果图. 二,源代码. <!DOCTYPE html><html><head> <meta charset="UTF-8"> & ...

  10. Python-zip压缩-解压

    #打包成zip文件 import zipfile f = zipfile.ZipFile('archive.zip','w',zipfile.ZIP_DEFLATED) f.write('file_t ...