python堆和栈的区别有哪些

堆(Heap)与栈(Stack)这是开发人员必须面对的两个概念。在理解这两个概念时,它们需要放在特定的场景中,因为堆和堆代表不同的意义。一般来说,有两层含义:(1)在程序内存布局场景中,堆和堆表示两种内存管理方法;(2)在数据结构场景中,堆和堆表示两种常见的数据结构。
相关推荐:Python教程
堆叠和堆叠实际上是操作系统占用的内存空间的两种管理方法,主要有以下区别:
(1)管理方法不同。堆栈由操作系统自动分配释放,无需我们手动控制;堆的申请和释放由程序员控制,容易产生内存泄漏;
(2)不同的空间尺寸。每个过程中的堆栈尺寸远小于堆栈尺寸。理论上,程序员可以申请的堆叠尺寸是虚拟内存的尺寸和过程堆叠的尺寸 64bits 的 Windows 默认 1MB,64bits 的 Linux 默认 10MB;
(3)不同的生长方向。堆的生长方向上,内存地址由低到高;堆栈的生长方向下,内存地址由高到低。
(4)不同的分布方式。堆是动态分配的,没有静态分配的堆。堆栈有两种分布方式:静态分布和动态分布。静态分布是由操作系统完成的,如局部变量分布。动态分布是由alloca函数分配的,但堆栈的动态分布不同于堆栈。他的动态分布是由操作系统释放的,不需要我们手动实现。
(5)不同的分配效率。堆栈由操作系统自动分配,并将在硬件层面为堆栈提供支持:分配专用寄存器存储堆栈的地址,并有专门的指令执行堆栈离开堆栈,这决定了堆栈的效率相对较高。堆由C/组成C++为完成应用和管理提供的库函数或操作符,实现机制复杂,频繁的内存应用容易产生内存碎片。显然,堆叠效率远低于堆叠效率。
(6)存储内容不同。堆栈存储的内容、函数返回地址、相关参数、局部变量和寄存器内容等。当主函数调用另一个函数时,需要使用堆栈来保存当前函数的执行断点。第一个进入堆栈的是主函数下一句的地址,即扩展指针寄存器的内容(EIP),然后是当前栈帧的底部地址,即扩展基址指针寄存器的内容(EBP),然后是调整函数的实际参考。一般来说,它是按照从右到左的顺序进入堆栈的,然后是调整函数的局部变量。请注意,静态变量存储在数据段或BSS段,不存储在堆栈中。离开堆栈的顺序恰恰相反。最后,堆栈的顶部指向主函数下一句话的地址,主程序从地址开始执行。堆叠。一般来说,堆叠顶部使用字节空间存储堆叠的大小,堆叠中的具体存储内容由程序员填写。
从上面可以看出,与堆栈相比,由于大量的malloc()//free()或new/delete的使用容易造成大量内存碎片,可能导致用户态和核心态之间的切换,效率低下。与堆叠相比,堆栈广泛应用于程序中。最常见的是函数的调用过程是通过堆叠来实现的。函数返回地址EBP、实参和局部变量存储在堆栈中。虽然堆栈有很多好处,但由于与堆相比不是那么灵活,有时会分配大量的内存空间,主要是使用堆。
无论是堆还是堆,在内存使用中防止非法越界,非法内存访问可能会破坏程序堆、堆数据,轻导致程序运行处于不确定状态,无法获得预期结果,严重导致程序异常崩溃,这些是我们在编程中处理内存时应注意的问题。
