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) ...
随机推荐
- C++ 学习笔记3,struct长度測试,struct存储时的对齐方式
之所以专门为struct的长度写一篇測试,是由于原来c++对于struct的变量, 在分配内存的时候,c++对struct有一种特殊的存储机制. 看以下的測试: 一.在Windows7 32bit , ...
- IOS-图片操作集合
编辑图片的几个方法 第一种 先用UIImage对象加载一张图片 然后转化成CGImageRef放到CGContext中去编辑 第二种 用CGImageCreate函数创建CGImageRef 然后把 ...
- C程序设计语言之一
%d 按照十进制整形数打印: %o 按照八进制整形数打印: %x 按照十六进制整形数打印: %c 表示字符 %s 表示字符串 %% 表示%本身打印: %ld long型输出 ”幻数“: #define ...
- load、save方法、spark sql的几种数据源
load.save方法的用法 DataFrame usersDF = sqlContext.read().load("hdfs://spark1:9000/users.pa ...
- Identifiers
Identifier An identifier is an arbitrarily long sequence of digits, underscores, lowercase and upper ...
- 百度SiteApp构建网站APP
现在很多个人网站和企业网站都是传统的Web方式,有没有想过个人/企业网站也能做成APP应用对外宣传呢?专门找人去开发Android和IOS上的APP又太贵,为了赶上移动互联网时髦,我以个人网站试做了一 ...
- 带OpenSSL和MySQL的静态编译版本~
http://www.npcglib.org/~stathis/blog/precompiled-qt4-qt5/ http://www.npcglib.org/~stathis/blog/preco ...
- Android ImageView(scaleType属性)图片按比例缩放
<ImageView android:id="@+id/img" android:src="@drawable/logo" android:scaleTy ...
- kingso - / - Taocode
kingso - / - Taocode 这两天在线下搭建了kingso示例服务,有兴趣的同学请自取. 源代码位置:192.168.201.73:9022 /home/wcm/kingso 安 ...
- 大整数乘法python3实现
因为python具有无限精度的int类型,所以用python实现大整数乘法是没意义的,可是思想是一样的.利用的规律是:第一个数的第i位和第二个数大第j位相乘,一定累加到结果的第i+j位上,这里是从0位 ...