AI 助理
备案 控制台
开发者社区 开发与运维 文章 正文

Stack的三种含义

简介:


文章目录[点击展开](?) [+]

  1. 前言
  2. 含义一数据结构
    1. 使用示例
  3. 含义二代码运行方式
    1. Java示例
  4. 含义三内存区域
    1. 数据存放区

前言

在我的《 C#集合类》一文曾讲到了C#的集合类中的Stack,但是关于Stack还真的是有几种不同的含义。

下方内容转载自阮一峰的日志: Stack的三种含义

学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈"。

理解这个概念,对于理解程序的运行至关重要。容易混淆的是,这个词其实有三种含义,适用于不同的场合,必须加以区分。

含义一:数据结构

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

bg2013112901

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

与这种结构配套的,是一些特定的方法,主要为下面这些。

使用示例

push:在最顶层加入数据。
pop:返回并移除最顶层的数据。
top:返回最顶层数据的值,但不移除它。
isempty:返回一个布尔值,表示当前stack是否为空栈。

含义二:代码运行方式

stack的第二种含义是 "调用栈"(call stack),表示函数或子例程像堆积木一样存放,以实现层层调用。

Java示例

下面以一段Java代码为例( 来源)。

复制代码
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(String[] args) {
            Student s;           
            s = new Student(23,"Jonh");
    }
}
复制代码

上面这段代码运行的时候,首先调用main方法,里面需要生成一个Student的实例,于是又调用Student构造函数。在构造函数中,又调用到setName方法。

bg2013112902

这三次调用像积木一样堆起来,就叫做"调用栈"。程序运行的时候,总是先完成最上层的调用,然后将它的值返回到下一层调用,直至完成整个调用栈,返回最后的结果。

含义三:内存区域

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

bg2013112903

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

bg2013112904

其他的区别还有,一般来说,每个线程分配一个stack,每个进程分配一个heap,也就是说,stack是线程独占的,heap是线程共用的。

此外,stack创建的时候,大小是确定的,数据超过这个大小,就发生stack overflow错误,而heap的大小是不确定的,需要的话可以不断增加。

数据存放区

根据上面这些区别,数据存放的规则是:只要是局部的、占用空间确定的数据,一般都存放在stack里面,否则就放在heap里面。请看下面这段代码( 来源)。

复制代码
public void Method1()
{
    int i=4;

    int y=2;

    class1 cls1 = new class1();
}
复制代码

上面代码的Method1方法,共包含了三个变量:i, y 和 cls1。其中,i和y的值是整数,内存占用空间是确定的,而且是局部变量,只用在Method1区块之内,不会用于区块之外。cls1也是局部变量,但是类型为指针变量,指向一个对象的实例。指针变量占用的大小是确定的,但是对象实例以目前的信息无法确知所占用的内存空间大小。

这三个变量和一个对象实例在内存中的存放方式如下。

bg2013112905

从上图可以看到,i、y和cls1都存放在stack,因为它们占用内存空间都是确定的,而且本身也属于局部变量。

但是,cls1指向的对象实例存放在heap,因为它的大小不确定。作为一条规则可以记住,所有的对象都存放在heap。

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

回答是整个stack被清空,i、y和cls1这三个变量消失,因为它们是局部变量,区块一旦运行结束,就没必要再存在了。

而heap之中的那个对象实例继续存在,直到系统的垃圾清理机制(garbage collector)将这块内存回收。

因此,一般来说,内存泄漏都发生在heap,即某些内存空间不再被使用了,却因为种种原因,没有被系统回收。



本文转自赵青青博客园博客,原文链接:http://www.cnblogs.com/zhaoqingqing/p/4021649.html,如需转载请自行联系原作者

史迪奇abc
目录
相关文章
诡异森林。
|
5月前
|
存储 算法 C++
C++初阶--queue和stack
C++初阶--queue和stack
诡异森林。
48 0
游客4llb6htoixmxw
|
5月前
back and forth 的含义和使用场合介绍
back and forth 的含义和使用场合介绍
游客4llb6htoixmxw
178 0
行十万里人生
|
4月前
|
C++ 容器
stack_queue:三个关键注意事项解析
stack_queue:三个关键注意事项解析
行十万里人生
28 0
小蜗牛~向前冲
|
5月前
|
存储 算法 前端开发
[C++基础]-stack和queue
[C++基础]-stack和queue
小蜗牛~向前冲
37 5
Paranoid
|
存储 调度
dump_stack分析函数调用关系实例及其实现
dump_stack分析函数调用关系实例及其实现
Paranoid
152 0
前端要努力QAQ
|
存储 JavaScript
基础数据结构(一):栈结构 Stack(TS版)
基础数据结构(一):栈结构 Stack(TS版)
前端要努力QAQ
115 0
Js_x
|
存储 C# 容器
简单数据结构类——Stack
简单数据结构类——Stack
Js_x
131 0
KookNut39
|
C++ 容器
stack以及使用举例--C++基础
stack以及使用举例--C++基础
KookNut39
138 0
stack以及使用举例--C++基础
致Great_VIP
|
C++ 容器
c++中stack、queue、vector的用法
c++中stack、queue、vector的用法
致Great_VIP
172 0
c++中stack、queue、vector的用法
一杯清茶呀
|
存储 缓存 监控
heap 和stack 有什么区别
heap 和stack 有什么区别
一杯清茶呀
293 0

热门文章

最新文章

  • 1
    TensorFlow中的那些高级API
  • 2
    安装Zabbix过程中出现的问题集
  • 3
    分布式1024节点!1天玩转PolarDB-X超大规模集群
  • 4
    阿里云郑晓:浅谈GPU虚拟化技术(第三章)
  • 5
    linux more命令: 按页阅读文件
  • 6
    AT&T的malloc实现--malloc的基础和本质
  • 7
    对pgpoo-II的pool_process_context的 proc_id 的理解
  • 8
    Palo Alto Networks CEO:合作伙伴正在淡化对传统安全厂商的关注
  • 9
    Extjs 项目中常用的小技巧,也许你用得着(5)--设置 Ext.data.Store 传参的请求方式
  • 10
    UIWebView和UIWebViewDelegate的基本用法
  • 1
    【题解】—— LeetCode一周小结42
    37
  • 2
    Kotlin - 面向对象之抽象类与接口
    26
  • 3
    Kotlin - 参数与异常
    25
  • 4
    Kotlin - 分支与循环
    24
  • 5
    Kotlin14 - 类成员
    28
  • 6
    Kotlin13 - 函数与Lambda表达式
    12
  • 7
    Kotlin12 - 分支与循环
    10
  • 8
    Kotlin - 常量与变量
    10
  • 9
    Kotlin10 - 面向对象之抽象类与接口
    11
  • 10
    Kotlin9- 参数与异常
    12
  • 相关电子书

    更多
  • 低代码开发师(初级)实战教程
  • 冬季实战营第三期:MySQL数据库进阶实战
  • 阿里巴巴DevOps 最佳实践手册
  • 下一篇
    阿里云无影云电脑免费试用,最长可试用3个月

    玻璃钢生产厂家知名校园玻璃钢雕塑制作厂家玻璃钢雕塑仿铜鹿摆件辽宁玻璃钢卡通雕塑潍坊玻璃钢美陈雕塑贵州抽象玻璃钢雕塑订做价格浙江室内商场美陈济南玻璃钢花盆价格高坪玻璃钢花盆花器环美玻璃钢雕塑定制厂长沙东方玻璃钢雕塑定制甘南玻璃钢卡通雕塑公司玻璃钢花盆批发厂家直销定西玻璃钢雕塑销售陕西玻璃钢雕塑品涉县玻璃钢花盆花器常州玻璃钢卡通雕塑厂家供应心形玻璃钢造型雕塑营口批发供应沈阳玻璃钢花盆澳门树脂玻璃钢雕塑商场南瓜美陈天津玻璃钢雕雕塑沈阳环保玻璃钢雕塑优势聊城玻璃钢马雕塑奥体商场入口美陈民权玻璃钢雕塑设计专做园林景观玻璃钢雕塑商场美陈气球动物造型北京大型商场创意商业美陈定制晋城玻璃钢仿铜雕塑绍兴创意玻璃钢雕塑设计香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

    玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化