python中的堆和栈,python的栈和队列

  python中的堆和栈,python的栈和队列

  不是所有的事情都是非黑即白的。基于堆栈的含义不应被视为排除数据存储在堆上的可能性。在

  首先,它只是指存在于VM中堆栈上的对象,但仍然不是所有的引用都存在于其中(它也指存在于堆中的对象中的其他对象)。在

  这里的堆栈是存储在堆栈中而不是寄存器中的临时数据。也就是说,如果你想把两个数相加,你把它们放在堆栈里然后执行加法指令,而不是在寄存器机器里,你把它们放在寄存器里然后相加。在

  现在,由于对象的生命周期是无限的,因此它们可以(或者至少是可行的)在堆栈上生存,所以有必要用堆来完成这个模型,以存储实际的对象。在

  此外,在堆栈模式下做一个从服务器是非常不切实际的。例如,VM必须能够访问全局范围(根据定义,它是一个类似于dict的对象)。虽然这个问题可以通过在栈上总是有一个全局引用来解决,但是这是很不切实际的。相反,有指令直接在全局范围内执行搜索。类似的推理也适用于局部作用域。你可以把所有的局部变量放在栈上,但是你把它们放在一个数组里,这更像寄存器机器里的情况,这就是LOAD_FAST出现的地方。在

  所以,其实cpythonvm更像是寄存器机和栈机的混合体。在

  那么对于没有栈的python来说,也有点混乱。此名称中的堆栈不是指同一个堆栈。相反是指C栈,不代表没有C栈,只是python解释器没有用C调用栈来跟踪python调用栈。这实际上意味着无栈python在VM中的栈比CPython多,而不是少。在

  区别在于调用函数时会发生什么。在CPython中,VM将简单地调用自己来执行方法,这意味着关于如何返回调用者的信息保留在C堆栈中。另一方面,在无栈python中,返回地址被推送到python栈上,VM继续直接执行函数,关于如何返回调用者的信息保存在VM栈上。无栈python的一个优点是每个python线程都不必使用单独的线程在C中执行(这意味着无栈python即使在不支持多线程的平台上也可以有线程)。在

  python的一些实现使用register machine代替,但同样,也不是非黑即白。你可能意识到了,函数的调用需要在某个地方存储返回信息,基本上要求存储在堆栈上。所以也是栈机和寄存器机的混合体。当然,它可能会使用C堆栈来保存返回给调用者的信息,这可能会使VM无法访问堆栈。在

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: