堆与栈的效率
1.背景
在闲聊或者面试的时候总会抛出到堆和栈两者的问题,计算机基础知识,但如果理解不深入,则回答不全面。下面总结下堆栈的相关知识。
2.堆与栈
1)程序执行过程说的堆与栈,和数据结构中的堆栈是有区别的,堆栈值不同内存区域的一个描述,多线程中,线程的堆栈是可以单独设置大小。
2)C(C++)中内存分配
全局变量、静态变量:全局区(静态区)分配内存;
局部变量、函数验压栈、递归:从栈上分配,系统管理,系统分配和释放;
malloc/new:从堆上分配,程序员管理,程序员分配和释放,不手动释放会导致内存泄漏;即使不释放,程序结束时,也会被系统回收。
常量字符串:文字常量区,程序结束时,由系统释放;
二进制代码:程序代码区。
3)分配过程与区别
a、堆上内存使用的是二级缓存,分配指令malloc/new;栈上内存使用的一级缓存,调用完毕立即释放;
b、堆都是动态分配,没有静态分配的堆;栈有静态分配和动态分配,静态分配由编译器完成,动态分配由alloca函数分配,但其分配释放过程由系统管理;
c、堆的分配由相关库函数(如C/C++)提供,分配过程遵循一些列高效算法(算法影响到分配效率、碎片管理等),使用过程需要检查是否分配成功;栈的分配由机器系统提供的数据结构,计算机底层分配专门的寄存器存放栈地址,压栈出栈都有专门的执行指令(从这点看出栈效率比堆要高);
d、堆从低地址向高地址增长;栈从高地址向低地址增长;
3.优缺点
以上,堆相对于栈,效率低,多次分配(malloc/new)容易产生碎片,使用时最好结合相关操作系统(Linux、Windows、RTOS )使用,因为系统针对内存管理有专门的优化算法,减少内存碎片。堆虽然有一定的缺点,但其最大的优点是使用灵活,而且堆容量大,一般需要申请比较大的内存块时,都会从堆中申请,比如申请4K字节的数组。
4.结论
以上,栈的效率比堆高。
5.但是
以现在的CPU架构,栈和堆的效率已经无差异了?请看这个
http://bbs.csdn.net/topics/390220569

浙公网安备 33010602011771号