堆与栈的效率

来源:互联网 发布:ubuntu pxe boot 编辑:程序博客网 时间:2024/05/29 14:00

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


原创粉丝点击