0%

堆和栈

  1. 栈(Stack):
    • 栈用于存储函数的局部变量、函数参数以及函数调用所需要的上下文信息。
    • 栈内存由系统自动分配和释放,由编译器管理。当一个函数被调用时,其所需的局部变量和参数被存储在栈上,当函数执行完毕时,这些变量的内存空间会被自动释放。
    • 栈的大小有限,通常较小,它们的大小在程序运行时是固定的,栈顶和栈底是预设好的,栈向栈底扩展。
    • 栈上的内存分配和释放速度比较快,不会有碎片。
  2. 堆(Heap):
    • 堆是用于动态内存分配的区域,用于存储程序运行时需要动态分配的数据,例如使用 malloc()calloc()new 等函数动态分配的内存。
    • 堆内存的分配和释放由程序员手动管理。程序员需要显式地分配内存并在不需要使用时手动释放内存,否则会产生内存泄漏。
    • 堆的大小通常比栈大得多,大小受操作系统的限制,通常由操作系统的虚拟内存大小决定,堆向高地址扩展是不连续的内存区域,大小可灵活调整。
    • 由于堆上的内存分配是动态的,需要维护额外的信息来跟踪已分配和未分配的内存块,因此堆上的内存分配和释放速度相对较慢,会产生内存碎片。