[重新认识 C++] 内存管理笔记 2 - 堆和栈的区别

yufei       1 周, 6 天 前       27

堆内存和栈内存区别还是蛮大的:

  • 空间大小不同

    • 栈的内存空间是连续的,空间大小由系统预先规划好的。也就是说栈的栈顶地址和最大空间是确定的。

    • 堆的内存空间是不连续的,由一个记录未使用的内存空间的链表负责管理。堆的内存空间几乎是无限的,但实际上受操作系统寻址和物理内存大小限制,比如 32 位操作系统下,最大内存只能达到 4G

  • 管理方式不同

    • 栈由编译器自动分配和释放。

    • 堆则由程序员使用 newdelete 关键字手动分配和释放。注意,如果忘记 delete 则可能产生内存泄露。

  • 生长方向不同

    • 栈的生长方向是自顶向下,也就是往内存地址小的地址方向生长。这也间接说明了为什么栈的内存空间时受限的。

    • 堆的生长方向则是自下向上,也就是往地址增大的方向发展。

  • 碎片化问题

    • 栈不存在碎片化问题,因为栈的内存空间是连续的,栈的后进先出策略保证了不会产生零碎的空间

    • 堆内存的分配方式则是在未分配的链表中遍历到第一个大于申请空间的节点,每次分配的空间大小一般不会正好等于申请的内存大小。因此,频繁的 new 操作必然会产生大量的空间碎片。

  • 分配效率

    • 栈属于机器系统提供的数据结构,计算器在底层为栈提供了进栈出栈的专门指令,效率高。

    • 堆则是由 c/c++ 函数库提供的,当分配内存时需要遍历一个链表,如果没发现合适的还可能要进行相应的处理,效率比较低。

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2018 简单教程 twle.cn All Rights Reserved.