设为首页 加入收藏

TOP

C++中栈与堆的区别
2017-06-14 10:22:48 】 浏览:735
Tags:区别

C++中栈与堆的区别

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

栈的情况:

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

堆的情况:

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

管理方式不同:栈是由编译器自动管理的。堆的释放工作是由程序员来控制的(delete),容易忽略。

空间大小不同:栈,一般都是有一定的空间大小。堆内存几乎是不受限制的。

碎片的产生:堆,频繁的new/delete势必会造成内存空间的不连续,造成大量的碎片空间,程序效率降低。栈,不会存在这个问题,栈是先进后出的队列,所以永远不可能在内存块中间出现碎片。

分配方式不同:堆是动态分配的,没有静态分配的堆。栈有两种分配方式:静态和动态,静态分配时编译器自己完成的(局部变量)动态分配是由alloca函数进行分配。

分配效率不同:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持。堆是C++函数库提供的,机制比较复杂,所以栈的分配效率比堆的效率高。

堆中的空间是动态申请的 运行时才分配的,栈中的空间是在编译时,链接器进行链接的时候就会确定其地址的,我们申请的局部变量就是栈空间。堆与栈相比劣势什么的我觉得谈不上,作用不同,不好评价。就比如静态数组和动态数组,当他们用来存储输入的时候,由于无法确定输入数量,无疑动态在这里更适合。

从效率上来说,村冲在栈中效率是更好的,因为在编译时就会确定其地址。但是在堆中申请空间则不同,要动态的分配地址,有时还会要与物理地址建立映射,开销是比栈更大的。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇py函数 下一篇C++中explicit关键字的作用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目