c++ 堆和栈的区别(又一篇)

转自: https://bbs.csdn.net/topics/390292159   用户 baichi4141

栈内存的效率的确是最高的,因为栈并不是一次次的分配内存,而是初始分配整个内存,每次压栈的时候只是单纯的移动栈指针而已
但栈的优点和缺点是一体的,都源于它的概念“先进后出”。简单地说,你先压栈一万字节,再压栈五个字节,在这五个字节被弹出栈之前,那一万个字节必须一直放在栈内——哪怕这五个字节你要使用一年,而那一万个字节你只使用一毫秒

堆内存的效率略低,主要是因为堆是随机访问,这里的随机,意为“每一块内存都和另一块内存没有先后关系”。申请堆内存的效率可能不比栈内存低多少,但释放堆内存的时候,释放的内存可能需要和旁边的未使用内存重新连成一个整体,以供下一次分配,因此释放堆内存的效率可能会较低,这是为了下一次申请时更快而必须付出的代价。

操作系统对栈的限制这我不了解,我只知道在编译器设置里可以限定栈的最大大小,例如VS里默认是1M大小
如果你需要更大的空间,可以自己在堆中申请,自己实现一个栈,而不是使用默认的栈内存,默认的栈内存主要用于流程控制,例如函数传参和临时变量保存等等,不需要太大。太大的栈内存可能会导致空间效率和时间效率的大大降低,如果你需要使用太大的栈内存,一般认为是你程序设计有问题

我觉得我说的很明白了,你是看不懂还是根本就不看?
栈的缺点在于“初始申请全部内存,所有数据先进后出”,例如你按照使用逻辑定义下列对象:一个整数,一块内存,一个整数,一块内存,那么在第二个整数退出使用之前,第一块内存就必须留在栈里面,无关你用不用它。结果就是,第一块内存就算浪费了。
堆的优点,就在于各块内存之间的无关性。栈的缺点,就在于各块内存是相关的。内存都是一样的,两种使用方法决定了它们各自的特点和性能。要按你想的“全部搞成栈”,那内存的使用效率将大大降低,因为绝大多数时间内,只有栈顶附近的那点数据被使用,而时间效率也会大大降低,因为要管理全部内存,内存之间的数据操作也要跨越太长地址,等等等等。
最简单的例子,所有内存长度不定的数据类型,它们扩展长度的方法都是“申请更大的空间,把现有数据复制过去,删除现有空间”。如果只有栈内存没有堆内存,那么每次扩展长度,都会直接导致原来的空间被浪费。
这还只是一个简单的例子,在任何复杂的系统里,都难以保证“每个变量必定在另一个特定的变量之前被删除,这些关系构成一个固定的序列”。不能保证这一点,这些变量所占用的内存空间就全部不能释放,后果——任何一个大一些复杂一些的系统,都会导致内存被迅速耗尽,最终系统崩溃。
 

猜你喜欢

转载自blog.csdn.net/hemeinvyiqiluoben/article/details/84979003