中易网

c++堆和栈的区别

答案:2  悬赏:10  
解决时间 2022-01-01 17:24
c++堆和栈的区别
最佳答案
堆与栈的区别:
1. 内存的分配方式和回收方式不同: 
        栈是后进先出,可以用一个简单程序例子可以体现出栈的后进先出:
             void test1(){
                     int num2;
                     test3
             }
              void test2(){
                     int num3;
             }
             int main(){
                     int num1;
                     test1();
             }
            程序执行过程说明 :  先给num1分配内存,然后调用test1后在给num2分配内存
            接着调用test2后给num3分配 分配顺序是num1,num2,num3
            先是调用完test2后回收num3的内存,接着调用完test1回收num2,最后调用完main函数
            回收num1, 回收的顺序是 num3,num2,num1
            体现后分配的先回收(后进先出)
            堆区内存是手动(new)分配,手动(delete)回收的


     2.栈区内存的分配大小受到限制,比如:栈分配的内存最大为1M(也有说2M,4M说法),
        但堆区内存空间很大,几十M甚至上G的内存都可以分配
  以上只是堆与栈的部分区别
全部回答
堆和栈的区别 管理方式不同 栈,由编译器自动管理,无需程序员手工控制;堆:产生和释放由程序员控制。 空间大小不同 栈的空间有限;堆内存可以达到4g,。 能否产生碎片不同 栈不会产生碎片,因为栈是种先进后出的队列。堆则容易产生碎片,多次的new/delete 会造成内存的不连续,从而造成大量的碎片。 生长方向不同 堆的生长方式是向上的,栈是向下的。 分配方式不同 堆是动态分配的。栈可以是静态分配和动态分配两种,但是栈的动态分配由编译器释放。 分配效率不同 栈是机器系统提供的数据结构,计算机底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令。堆则是由c/c++函数库提供,库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。 堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,ebp和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。 栈和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。 无论是堆还是栈,都要防止越界现象的发生。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎么群消息总是看不见,显示以上是历史消息
海信电视上网上邻居要用户名和密码
詞筆的意思是什么?詞筆的释义是什么啊?
浮金的意思是什么啊?请解释下!
殊祥的意思是什么?殊祥的释义是什么啊?
天气么么哒,心情闷闷哒什么意思
销售的层次是怎样的?以前听说过一句话是一等
挑刺的意思是什么?挑刺的释义是什么啊?
水口社区居委会地址在什么地方,想过去办事
发了微信对方不显示提示
1÷3+1÷5+1÷7+1÷9+1÷11+1÷13=详细过程
打胡哨的意思是什么啊?请解释下!
给笔记本安装系统时屏幕上出现there.is.no.va
大潮的意思是什么?大潮的释义是什么啊?
惵息的意思是什么?惵息的释义是什么啊?
推荐资讯
如何将酷狗音乐播放器的歌曲复制到光盘上?是
人民币贬值纺织股为什么涨
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?