Stack - 栈

为了去野外烧烤,你创建了一堆的任务清单 - 一叠便条。对一叠便条会有如下操作:插入的待办事项放在清单的最前面;读取待办事项时,只读取最上面的,并将其删除。一叠便条就是栈,插入对应着栈的压入操作,读取并删除对应着栈的弹出操作。

调用栈

计算机在内部使用被称为调用栈的栈。下面以一段代码来解释调用栈。

def greet(name):
    print("hello," + name + "!")
    greet2(name)
    print("getting ready to say bye...")
    bye()
    
def greet2(name):
    print("how are you," + "?")
    
def bye():
    print("ok,bye!")

假设调用 greet(caoqi),计算机会首先为这个函数调用分配出一块内存。每当调用函数的时候,计算机都会将函数调用涉及到的所有变量的值存储到内存中。比如一开始name变量被设置为caoqi的时候,会将其存储在分配出的内存中。

程序接下来是打印hello,caoqi!,然后再调用greet2(caoqi)。同样的,计算机也会为其分配出内存。

计算机使用一个栈来表示这些内存块,其中第二个内存块位于第一个内存块上方。当打印完how are you,caoqi?,会从函数调用返回,所以,此时栈顶的内存块会被弹出,即函数greet2被弹出。 弹出之后,栈顶的内存块变为函数greet,这意味着又回到了函数greet。调用函数greet2的时候,只是执行了函数greet的一部分。这里涉及到一个重要的概念:调用另一个函数的时候,当前的函数暂停并处于未完成状态。执行完函数greet2后,回到函数greet,并从离开的地方继续往下运行。首先打印getting ready to say bye...,再调用函数bye

此时,在栈顶增加了函数bye的内存块。打印完ok,bye!,从这个函数返回后,函数bye的栈顶被弹出。最后,又回到了函数greet,程序已执行完,就从函数greet返回。 上面提到的用来存储多个函数的变量的栈,被称为调用栈。从上面过程中,也能发现调用栈的缺点,即当调用的函数越多时,调用栈可能会很长,这将占用计算机大量的内存。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Reinforcement Learning笔记(1)--基本框架-问题和解决方案

    RL的基本框架如下图所示,主要是指智能体(Agent)如何学习与环境(Environment)互动的过程。 将时间离散化看待,在最开始的时间步中,环境会向智能...

    caoqi95
  • PRML读书笔记(2) - 深度理解机器学习之决策论(Decision Theory)

    「总结自经典教材《Pattern Recognition and Machine Learning》以及김동국教授的人工神经网络纯理论课程。在此感谢作者及教授的...

    caoqi95
  • Coursera NLP 课程 - 第一周 - 02 - 纯文本分类

    「学习内容总结自 coursera 上的 Natural Language Processing 课程」

    caoqi95
  • 【翻译】为什么 goroutine 的栈内存无穷大?

    一些 Go 语言的新学习者总是会对 goroutine 栈内存占用大小感到非常好奇。这一般是由于程序员进行无限的函数循环调用导致的。为了说明这个问题,请思考以下...

    李海彬
  • VC的内存泄漏检查

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    大菊观
  • (转载)VC的内存泄漏检查

    原文链接:https://blog.csdn.net/psbeond/article/details/99546363

    大菊观
  • Github之修改用户名

    2016-07-1013:48:05 发表评论 218℃热度 这几天开始正式深入学习Github方面的知识,由于之前的用户名比较随便,所以第一件事就是更改自己...

    timhbw
  • 【Java】21 基于 UDP 的网络编程

      UDP 协议是英文 User Datagram Protocol 的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络连接。UDP 协议...

    Demo_Null
  • Spark Core源码精读计划24 | StaticMemoryManager——静态内存管理机制

    在上一篇文章的最后,我们阅读了内存管理器MemoryManager抽象类的源码,并且提到它有两种实现:静态内存管理器StaticMemoryManager、统一...

    大数据真好玩
  • 《Java从入门到失业》第四章:类和对象(4.4):方法参数及传递

           关于这个知识点,我想了很久该不该在这里阐述。因为这个知识点稍微有点晦涩,并且就算不了解也不影响用Java编写代码。不过笔者刚开始工作的时候,就是因...

    用户7801119

扫码关注云+社区

领取腾讯云代金券