c++中在堆和栈中申请空间的差别

堆中和栈中申请的空间的比较, 我找到了下面的比较:

栈的情况:
栈上分配空间的好处是快,而且对象生存期是自动的,离开当前域之后就自动析构回收。
坏处就是栈空间有限,而且不能人为控制对象的生存期,
比如你无法将一个函数内部的栈上的对象返回,因为这个函数执行完毕后栈空间会自动回收。

堆的情况
堆上分配空间就相反,new一个空间出来是较慢的,而且对堆上对象的访问也稍慢于栈上。
一旦new一个空间出来,需要自己手动去delete回收,系统不会帮你管理回收(用GC的除外),
但是分配空间大小灵活,而且正因为是手动回收的,你可以自由控制对象生存期,常用来跨域传递对象。

管理方式不同:栈是由编译器自动管理的。堆的释放工作是由程序员来控制的(delete),容易忽略。
空间大小不同:栈,一般都是有一定的空间大小。堆内存几乎是不受限制的。
碎片的产生:堆,频繁的new/delete势必会造成内存空间的不连续,造成大量的碎片空间,程序效率降低。栈,不会存在这个问题,栈是先进后出的队列,所以永远不可能在内存块中间出现碎片。
分配方式不同:堆是动态分配的,没有静态分配的堆。栈有两种分配方式:静态和动态,静态分配时编译器自己完成的(局部变量)动态分配是由alloca函数进行分配。
分配效率不同:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持。堆是C++函数库提供的,机制比较复杂,所以栈的分配效率比堆的效率高。

堆中的空间是动态申请的 运行时才分配的,栈中的空间是在编译时,链接器进行链接的时候就会确定其地址的,我们申请的局部变量就是栈空间。堆与栈相比劣势什么的我觉得谈不上,作用不同,不好评价。就比如静态数组和动态数组,当他们用来存储输入的时候,由于无法确定输入数量,无疑动态在这里更适合。
从效率上来说,村冲在栈中效率是更好的,因为在编译时就会确定其地址。但是在堆中申请空间则不同,要动态的分配地址,有时还会要与物理地址建立映射,开销是比栈更大的。

点击查看原始尺寸

posted on 2013-04-08 20:03  joygpwan  阅读(3180)  评论(0编辑  收藏  举报

导航