堆栈的对比
一、管理方式
栈:由编译器自动管理的,无需手工控制;
堆:是否工作由程序猿控制,易产生memory Leak。
二、申请大小
栈:在windows下,栈的大小为2M,它是向低地址扩展的数据结构。意思是栈顶上的地址和栈的最大容量是系统预先约定好的,如果申请的空间超过了栈的剩余空间就会overflow;
堆:它是向上扩展的数据结构,是不连续的内存区域,这是由于系统是用链表来存储空闲内存地址的。堆的大小受限于系统的有效虚拟内存,由此可见堆内存获取的空间比较灵活,也比较大。
三、碎片问题
栈:它是先进后出的队列,如此的一一对应,以至于永远都不可能有一个从栈中弹出,故不存在碎片问题;
堆:频繁地NEW/DELETE,势必会造成内存空间的不连续,从而造成大量的碎片,使得程序效率降低。
四、分配方式
栈:静态分配和动态分配。静态分配是编译器完成的,如局部变量的分配;动态分配是由alloc函数进行分配的,与堆的动态分配不同的是,栈的动态分配由编译器进行释放,无需使我们手工实现。
堆:动态分配。
五、分配效率
栈:她是机器系统提供的数据结构,计算机会在底层提供支持,分配专门的寄存器存放栈的地址,压栈出栈都有专门的执行命令,这就决定了栈的效率比较高。
堆:它是C/C++函数库提供的,机制较为复杂。
小结:
内存的基本构成:静态存储区、堆区和栈区
1、静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。他主要用于存放静态数据,全局数据和常量。
2、堆区:程序在运行时用malloc或new申请任意大小的内存,程序猿自己负责在适当的时候用free或delete释放内存。动态内存的生命周期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。良好的编程习惯是:如果某动态内存不再使用,就及时将其释放掉,否则我们将认为发生了内存泄露。
3、栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上面创建,函数执行结束时这些存储单元会被自动释放。栈内存分配运算内置于处理器的指令集中,效率很高,但分配的内存容量有限。
参考: