总述
C++ 中堆和栈主要有以下几点不同:
管理方式不同
空间大小不同
能否产生碎片不同
生长方向不同
分配方式不同
分配效率不同
详情
管理方式: 对于栈来讲, 是由编译器自动管理, 无需手动控制; 对于堆来说, 分配和释放都是由程序员控制的.
空间大小: 总体来说, 栈的空间是要小于堆的. 一般来讲在 32 位系统下, 堆内存可以达到 4G 的空间, 从这个角度来看堆内存几乎是没有什么限制的; 但是对于栈来讲, 一般是有一定的空间大小的.
碎片问题: 对于堆来讲, 由于分配和释放是由程序眼控制的 (利用 new/delete 或 malloc/free), 频繁的操作势必会造成内存空间的不连续, 从而造成大量的内存碎片, 使程序效率降低. 对于栈来讲, 则不会存在这个问题, 因为栈是先进后出的数据结构, 在某一对象弹出之前, 它之前的所有对象都已经弹出.
生长方向: 对于堆来讲, 生长方向是向上的, 也就是沿着内存地址增加的方向, 对于栈来讲, 它的生长方式是向下的, 也就是沿着内存地址减小的方向增长.
分配方式: 堆都是动态分配的, 没有静态分配的堆. 栈有两种分配方式: 静态分配和动态分配, 静态分配是编译器完成的, 比如局部变量的分配; 动态分配由 alloca 函数进行分配, 但是栈的动态分配和堆是不同的, 它的动态分配是由编译器实现的, 无需我们手工实现.
分配效率: 栈是机器系统提供的数据结构, 计算机会在底层对栈提供支持, 分配专门的寄存器存放栈的地址, 压栈出栈都有专门的指令执行, 这就决定了栈的效率很高. 堆则是 C/C++ 函数提供的, 它的机制是很复杂的, 例如为了分配一块内存, 库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间, 如果没有足够大小的空间 (可能是由于碎片太多), 就有可能调用系统功能去增加程序数据段的内存空间, 这样就有机会分到足够大小的内存, 然后进行返回. 显然, 堆的效率要比栈底的多.
参考文献
来源: http://www.bubuko.com/infodetail-2833406.html