python堆和栈的概念,python有堆栈吗

  python堆和栈的概念,python有堆栈吗

  堆和栈是开发人员必须面对的两个概念。在理解这两个概念时,需要把它们放到具体的场景中,因为在不同的场景中,heap和stack代表不同的含义。一般来说,有两层意思:

  (1)在程序内存布局场景中,堆和栈代表两种内存管理模式;

  (2)在数据结构场景中,堆和栈代表了两种常用的数据结构。

  相关:《Python教程》

  堆和栈实际上是操作系统管理进程占用内存空间的两种方式。主要有以下区别:

  (1)管理方式不同。堆栈由操作系统自动分配和释放,无需我们手动控制;堆的申请和释放由程序员控制,容易造成内存泄漏;

  (2)空间大小不同。每个进程的堆栈大小远小于堆大小。理论上程序员可以申请的堆大小是虚拟内存的大小,进程栈的大小在64位和10MB的Windows中默认为1MB默认情况下,在64位Linux中。

  (3)成长方向不同。堆的增长方向是向上的,内存地址从低到高;栈的增长方向是向下的,内存地址是从高到低的。

  (4)不同的分配方式。堆是动态分配的,没有静态分配的堆。栈的分配有两种方式:静态分配和动态分配。静态分配是由操作系统完成的,比如局部变量的分配。动态分配是由alloca函数分配的,但是栈的动态分配和堆的动态分配是不一样的。它的动态分配是操作系统释放的,我们不需要手动实现。

  (5)不同的分配效率。堆栈由操作系统自动分配,操作系统会在硬件层面对堆栈提供支持:分配专门的寄存器来存储堆栈的地址,按下和离开堆栈时执行专门的指令,这就决定了堆栈的高效率。堆是通过C/C提供的库函数或运算符来应用和管理的,实现机制复杂,频繁的内存应用容易产生内存碎片。显然堆的效率比栈低很多。

  (6)存储内容不同。堆栈内容、函数返回地址、相关参数、局部变量和寄存器内容等。当主函数调用另一个函数时,要保存当前函数的断点,就需要堆栈。首先是主函数下一条语句的地址,即扩展指针寄存器(EIP)的内容,然后是当前堆栈帧的底地址,即扩展基址指针寄存器(EBP)的内容,然后是被调用函数的参数等。一般是从右到左堆叠,后面是被调用的函数。堆叠顺序正好相反。最后,栈顶指向main函数中下一个语句的地址,主程序从这个地址开始执行。堆,一般来说,堆的顶部用一个字节的空间来存储堆的大小,堆中的具体内容由程序员来填充。

  从上面可以看出,与stack相比,由于使用了大量的malloc()/free()或new/delete,heap很可能造成大量的内存碎片,并可能造成用户状态和核心状态的切换,效率低下。与堆相比,堆栈在程序中应用广泛。最常见的是函数的调用过程是通过栈来实现的,函数的返回地址、EBP、自变量和局部变量都是通过栈来存储的。虽然stack有很多优点,但是因为没有heap那么灵活,所以有时候会分配很多内存空间,主要使用heap。

  不管是堆还是栈,在使用内存的时候都要防止非法越界。越界导致的非法内存访问可能会破坏程序的堆和栈的数据。至少,可能会导致程序在不确定的状态下运行,得不到预期的结果。最坏的情况下,可能会导致程序异常崩溃。这些都是我们在编程时处理内存时要注意的问题。

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

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