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

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

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

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

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

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

点击查看原始尺寸

转载于:https://www.cnblogs.com/hahawgp/archive/2013/04/08/3008737.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推销自己的海盗猫王运营商

因此,Java没有Elvis运算符(或者更正式的名称是null合并运算符或null安全成员选择)……虽然我个人不太在意它,但有些人似乎很喜欢它。 当一位同事需要几天后,我坐下来探讨了我们的选择。 而且你知道什么! 您…

sunos 查cpu主频指令prtdiag

sun查cpu主频指令 usr/sbin/psrinfo -v ...虚拟处理器 63 在下列时间的状态:09/10/2013 14:23:52自 04/08/2013 17:41:40 开始已在运行。sparcv9 处理器以 2660 MHz 运行,而且有 sparcv9 浮点数处理器 sun的prtdiag指令: 查cpu个数 bash-3.2$ uname -a SunOS m5000…

使用CDI简化JAX-RS缓存

这篇文章(通过一个简单的示例)说明了如何使用CDI Producers使其在RESTful服务中利用缓存控制语义更加容易 与HTTP 1.0中可用的Expires标头相比, HTTP 1.1中添加了Cache-Control标头,这是急需的改进。 RESTful Web服务可以利用此标…

字符串字符和数字分割

现在有个String类型的字符串: String str"AA120"; 我想把它分解成 AA ;120 就是把数字和字母分开; 求方法 补充: 格式是前面是字母 不确定几位,后面是数字,也不确定几位 就是"AA111…

transform限制position:fixed的跟随效果

我们应该都知道,position:fixed可以让元素不跟随浏览器的滚动条滚动,而且这种跟随效果连它的兄弟们position:relative/absolute都限制不了。但是,真是一物降一物,position:fixed固定效果却被小小的transform给干掉了,直…

Maven提示:有关可执行jar的所有信息

Maven提示:有关可执行jar的所有信息 在分发代码时,可执行jar是非常有用的工具。 这意味着,只要将Java安装在客户端计算机上,至少在Windows和Mac上,您的用户只需双击jar即可启动程序。 另外,在命令行上&…

C# 查询一张表的数据用于补充另外一张表的数据 MySQL数据库

UPDATE bookhistory bh set bh.CategoryId (SELECT CategoryId FROM booklist bk where bk.Id bh.BookListId)

Gentoo man手册指南

转载:http://www.gentoo.org/doc/zh_cn/man-guide.xml#doc_chap2 http://blog.csdn.net/andyelvis/article/details/4044938 使用man命令技巧 Gentoo man手册指南 内容: 1. 简介2. 使用man结构 1. 简介 man程序 每一个人在他的linux人生中都使用…

Java 8 Lambda表达式教程

问候! :) 离开几个月后,我决定恢复风格:)。 我注意到我以前有关新的Date / Time API的一篇文章非常受欢迎,因此这次我将把本篇文章专门介绍Java 8的另一个新功能: Lambda Expressions 。 功能编程 Lambda表达式是Java编程语言最…

React 父组件(hooks)调用子组件(calss)方法

父组件&#xff08;hooks&#xff09; let richTextRef {};<RichText getRichText{getRichText} content{content} onRef{ref > richTextRef ref} />子组件&#xff08;class&#xff09; componentDidMount () > {this.props.onRef && this.props.onRe…

[HDU] 2553 N皇后问题-简单深搜

题目链接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid2553 方法&#xff1a; 1.可以用对称的思想&#xff0c;即&#xff1a;如果N是偶数&#xff0c;则只计算第一个皇后分别放在第一行的位置1到N/2这N/2个情况的结果和&#xff0c;最后再乘以2。如果是奇数&#…

您真的了解@WebService吗?

SOAP Web服务无论如何都不是最先进的技术-尽管它仍然存在&#xff0c;但是基于REST的Web服务却提供了激烈的竞争。 无论如何–这绝对不是REST vs SOAP帖子&#xff01; 我观察到了一些实例&#xff0c;至少可以说&#xff0c;使用基于Java的SOAP Web服务的方式不太理想。 我认…

全局使用dva dispatch

// 第一种 这个umi2还可以 umi3就不可以了 window.g_app._store.dispatch({type: login/logout,});// 第二种 调用dispatch(所有models都可以) getDvaApp()._store.dispatch({type: login/logout,});

[转]JQuery.Ajax之错误调试帮助信息

本文转自&#xff1a;http://blog.csdn.net/lampsunny/article/details/8053967 下面是Jquery中AJAX参数详细列表&#xff1a; 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址。 type String (默认: "GET") 请求方式 ("POST&quo…

将策略插入JBoss Apiman

JBoss apiman项目 本周刚刚发布了1.0.3.Final 。 它主要是一个错误修复版本&#xff0c;仅进行了一些相对较小的改进。 自从我上次写博客以来&#xff0c;其中的一个特殊功能就是对插件的支持。 这些插件可以轻松添加到系统中&#xff0c;以提供其他功能。 将策略添加为插件 当…

Error: Module “xxx“ does not exist in container. / antd pro v5启用qiankun报错 / 同时使用mfsu和qiankun报错

一、问题描述 我们用antd pro v5搭建前端项目&#xff0c;启用qiankun微前端模式&#xff0c;终端报错如下&#xff1a; Uncaught (in promise) Error: Module “xxx” does not exist in container. while loading “xxx” from webpack/container/reference/mf 经过排查&…

双链表

问题&#xff1a;在分配空间时&#xff0c;遇到问题 定义一个结构体&#xff1a; typedef struct dLinkListNode{ int data; struct dLinkListNode *prior; struct dLinkListNode *next;}*dLinkList,dListNode; dList(dLinkList)malloc(sizeof(dListNode));与dList(dLinkList)m…

paip.C#.NET多线程访问 toolStripStatusLabel

paip.C#.NET多线程访问 toolStripStatusLabel 作者Attilax &#xff0c; EMAIL:1466519819qq.com toolStripStatusLabel控件比较特殊&#xff0c;无法定义invoke来线程调用。。只好使用原生委托..代码稍微多一些.. delegate void clsC417(); xxx() { …

antd Table/ProList中rowClassName用法(补充记录)

rowClassName{setRowClassName}const setRowClassName (record) > {return record.id currentRecord ? styles.checkstyle : ;};