zoukankan      html  css  js  c++  java
  • c++中在堆和栈中申请空间的差别

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

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

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

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

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

    点击查看原始尺寸

  • 相关阅读:
    CodeForces
    Educational Codeforces Round 111 (Rated for Div. 2)
    「JOISC 2020 Day4」治疗计划
    [杂题合集] 其真无码耶?
    [2021.7.16] 洛谷七月月赛
    倾心力作!嵌入式linux开发指南(RK3399),3399教程1500+,开发资料全覆盖
    资料丨迅为IMX6ULL开发板-主频和时钟配置例程(二)
    资料丨迅为IMX6ULL开发板-主频和时钟配置例程
    自学嵌入式拉低偏差丨4412开发板学习指引+为学习后面内容打下基础
    文档资源有话说丨再次升级-i.MX6Q开发板手册更新
  • 原文地址:https://www.cnblogs.com/hahawgp/p/3008737.html
Copyright © 2011-2022 走看看