堆内存和栈内存区别还是蛮大的:
-
空间大小不同
-
栈的内存空间是连续的,空间大小由系统预先规划好的。也就是说栈的栈顶地址和最大空间是确定的。
-
堆的内存空间是不连续的,由一个记录未使用的内存空间的链表负责管理。堆的内存空间几乎是无限的,但实际上受操作系统寻址和物理内存大小限制,比如 32 位操作系统下,最大内存只能达到 4G
-
-
管理方式不同
-
栈由编译器自动分配和释放。
-
堆则由程序员使用
new
和delete
关键字手动分配和释放。注意,如果忘记delete
则可能产生内存泄露。
-
-
生长方向不同
-
栈的生长方向是自顶向下,也就是往内存地址小的地址方向生长。这也间接说明了为什么栈的内存空间时受限的。
-
堆的生长方向则是自下向上,也就是往地址增大的方向发展。
-
-
碎片化问题
-
栈不存在碎片化问题,因为栈的内存空间是连续的,栈的后进先出策略保证了不会产生零碎的空间
-
堆内存的分配方式则是在未分配的链表中遍历到第一个大于申请空间的节点,每次分配的空间大小一般不会正好等于申请的内存大小。因此,频繁的
new
操作必然会产生大量的空间碎片。
-
-
分配效率
-
栈属于机器系统提供的数据结构,计算器在底层为栈提供了进栈出栈的专门指令,效率高。
-
堆则是由 c/c++ 函数库提供的,当分配内存时需要遍历一个链表,如果没发现合适的还可能要进行相应的处理,效率比较低。
-
目前尚无回复