Stack栈的三种含义
理解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栈的三种含义的更多相关文章
- Stack的三种含义 ----超级经典 明白了 栈 的三种含义
来自:http://www.ruanyifeng.com/blog/2013/11/stack.html ----------------------------------------------- ...
- Stack的三种含义(数据超过栈的大小,就发生stack overflow)
非常典型的基础知识,转自http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈& ...
- Stack的三种含义
作者: 阮一峰 日期: 2013年11月29日 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈". 理解这个概念,对于理解程序的运行至关重要.容易混淆的是,这个词 ...
- Stack的三种含义(转载--阮一峰)
作者: 阮一峰 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈". 理解这个概念,对于理解程序的运行至关重要.容易混淆的是,这个词其实有三种含义,适用于不同的场合 ...
- [转帖]Stack的三种含义
Stack的三种含义 http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈&q ...
- "《算法导论》之‘栈’":栈的三种实现(静态数组、动态数组及指针)
本文有关栈的介绍部分参考自网站数据结构. 1. 栈 1.1 栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底( ...
- 分治FFT的三种含义
分治FFT是几个算法的统称.它们之间并无关联. 分治多项式乘法 问题如求\(\prod_{i=1}^na_ix+b\). 若挨个乘复杂度为\(O(n^2\log n)\),可分治做这件事,复杂度为\( ...
- static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数
C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域. 从作用域看: 全局变量具有全局作用域.全局变量只需在一个源文件 ...
- "《算法导论》之‘队列’":队列的三种实现(静态数组、动态数组及指针)
本文有关栈的介绍部分参考自网站数据结构. 1. 队列 1.1 队列的定义 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表. (1)允许删除的一端称为队头(Front) ...
随机推荐
- IT第九天 - 包、访问修饰符、变量的内存分配、String类中常用方法
IT第九天 上午 包 1.包的命名规则:域名.项目名称.模块名 2.如:Wfei.com.windows.login 访问限制符 1.四种访问限制符分别对应为: (1)default:默认的,默认为p ...
- uva--11991 - Easy Problem from Rujia Liu?(sort+二分 map+vector vector)
11991 - Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for e ...
- [Swust OJ 842]--实验室和食堂(最短路,Dijkstra算法)
题目链接:http://acm.swust.edu.cn/problem/842/ Time limit(ms): 1000 Memory limit(kb): 10000 Description ...
- Palindromes _easy version
Palindromes _easy version Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- 2014 HDU多校弟九场I题 不会DP也能水出来的简单DP题
听了ZWK大大的思路,就立马1A了 思路是这样的: 算最小GPA的时候,首先每个科目分配到69分(不足的话直接输出GPA 2),然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到10 ...
- json文件问题
在json数据没有错误 字符 的前提下 出现的问题 如果有中文 那么编码格式 必须是UTF-8格式的
- Altera FPGA中的pin简介
第一步要看的肯定是pin planner ,这个是黑金四代EP4CE15F17C8的视图 先就是发现他们pin有不同的颜色区域,分别对应不同的bank,应该是有的设计里面要求pin在同一个bank吧( ...
- ASP.NET MVC 5 学习教程:添加控制器
原文 ASP.NET MVC 5 学习教程:添加控制器 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过 ...
- Flask web开发 请求拦截和预处理
我们在开发WEB应用时,往往会需要对所有的url请求进行拦截,做些预处理,比如权限处理.日志等统一处理. 本文介绍一下Flask中的处理机制.我们通过一个简单的例子来说明. 1.编写一个简单应用 ru ...
- polling轮询和comet
comet:(原意:彗星) Comet is a web application model in which a long-held(held:保留) HTTP request allows a w ...