1
2
ClassA a = ClassA();
ClassA * ap = new ClassA();

第一种方式是在进程虚拟地址空间中的栈中分配内存,而第二种使用了new,在堆中分配了内存,而栈中内存的分配和释放是由系统管理,而堆中内存的分配和释放必须由程序员手动释放,所以这就产生一个问题是把对象放在栈中还是放在堆中的问题,这个问题又和堆和栈本身的区别有关:

这里面有几个问题:
1.堆和栈最大可分配的内存的大小
2.堆和栈的内存管理方式
3.堆和栈的分配效率

首先针对第一个问题,一般来说对于一个进程栈的大小远远小于堆的大小,在linux中,你可以使用ulimit -s (单位kb)来查看一个进程栈的最大可分配大小,一般来说不超过8M,有的甚至不超过2M,不过这个可以设置,而对于堆你会发现,针对一个进程堆的最大可分配的大小在G的数量级上,不同系统可能不一样,比如32位系统最大不超过2G,而64为系统最大不超过4G,所以当你需要一个分配的大小的内存时,请用new,即用堆。

其次针对第二个问题,栈是系统数据结构,对于进程/线程是唯一的,它的分配与释放由操作系统来维护,不需要开发者来管理。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储单元会被自动释放。栈内存分配运算内置于处理器的指令集中,效率很高,不同的操作系统对栈都有一定的限制。 堆上的内存分配,亦称动态内存分配。程序在运行的期间用malloc申请的内存,这部分内存由程序员自己负责管理,其生存期由开发者决定:在何时分配,分配多少,并在何时用free来释放该内存。这是唯一可以由开发者参与管理的内存。使用的好坏直接决定系统的性能和稳定。

由上可知,但我们需要的内存很少,你又能确定你到底需要多少内存时,请用栈。而当你需要在运行时才知道你到底需要多少内存时,请用堆。

最后针对第三个问题,栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率 比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在 堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会 分 到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

C++使用new和不使用new关键字实例化对象的区别相关推荐

  1. 对C#中用new关键字实例化对象的理解

    [前置知识] 对值类型和引用类型的理解 公共语言运行时CLR 对C#数组声明方式的理解 [实例化格式] 类名  对象名 = new 类名 (参数列表) [相关概念辨析] 类是模板,定义了对象在实例化的 ...

  2. New关键字(实例化对象)

    New关键字 Point originOne = new Point(23, 94); Rectangle rectOne = new Rectangle(originOne, 100, 200); ...

  3. 【转载】C#使用is关键字检查对象是否与给定类型兼容

    在C#的编程开发过程中,很多时候涉及到数据类型的转换,如果强行转换数据类型,有时候可能会出现程序运行时错误,C#语言中提供了is关键字可以检查对象是否与给定类型兼容,可先判断类型兼容后再进行对象的转换 ...

  4. 在c语言中保留字是有专门含义和作用的,c语言中的关键字和保留字的区别?

    c语言中的关键字和保留字的区别?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c语言中的关键字和保留字的区别? 在C语 ...

  5. C#中ref和out关键字的应用以及区别。

    C#中ref和out关键字的应用以及区别. ref ref的定义 ref 的使用 out out的定义:来自MSDN out的用法 ref和out的区别 Stack Overflow的解释: 之前要学 ...

  6. Java-Day12 面向对象的三大特征之封装、继承,单例模式(饿汉式、懒汉式)、方法重写 (覆盖)、注解 (annotation)、super关键字、对象的创建流程超详细

    目录 1. 面向对象的三大特征之封装 1.1 封装的含义 1.2 封装的目的 1.3 封装的优点 1.4 封装的实现过程 1.5 拓展知识:JavaBean 2. 面向对象的三大特征之继承 2.1 继 ...

  7. (1)访问控制 (2)final关键字 (3)对象创建的过程 (4)多态

    1.访问控制(笔试题) 1.1 常用的访问控制符 public - 公有的 protected - 保护的 啥也不写 - 默认的 private - 私有的 1.2 访问控制符的比较 访问控制符 访问 ...

  8. C# new关键字和对象类型转换(双括号、is操作符、as操作符)

    一.new关键字 CLR要求所有的对象都通过new来创建,代码如下: Object obj=new Object(); 以下是new操作符做的事情 1.计算类型及其所有基类型(一直到System.Ob ...

  9. IPHONE 开发 9 -- Object C static关键字,数组对象,词典,动态词典,集合对象,函数调用关系...

    警告:  static 写在interface外面编译是没有错误的,但是编译器会报警告,这么说这样的写法是不被编辑器认可的. 错误:static 写在interface里面会直接报错,显然这样的语法是 ...

最新文章

  1. 经典算法面试题目-置矩阵行列元素为0(1.7)
  2. [HAOI 2018]染色
  3. 【牛客 - 289 I】这是一个沙雕题I (字符串问题,水题)
  4. Mysql5.7使用DTS增量同步数据到MaxCompute
  5. 嵌入式电路设计(从电路到系统)
  6. C# Socket 简易的图片传输
  7. 麦轮平台的速度分解与合成
  8. 使用基于轮询的SQL数据缓存依赖
  9. HP Compaq 6080 Pro 主机设置wakeonlan
  10. 【智能无线小车系列二】车体的组装
  11. iRightMouse 1.2.0 中文版 (超赞的Mac右键菜单扩展)
  12. Visa在全球范围内增加对女足的投入
  13. 《学Unity的猫》——第十章:Unity的物理碰撞,流浪喵星计划
  14. 天使轮和种子轮投资降温!2019风投趋势如何走?
  15. 熊去氧胆酸的药物行业调研报告 - 市场现状分析与发展前景预测
  16. 阿里数据分析师面试准备二:对阿里数据分析师岗位的理解
  17. 推荐系统基础03:矩阵分解与FM
  18. 软件质量有什么特性?
  19. Lucene学习——IKAnalyzer中文分词(二)
  20. uniapp+unicloud开发微信小程序流程

热门文章

  1. musical.ly体验-这款国产外销的APP凭什么登上美国榜首?
  2. 500只产品汪周末齐聚宇宙中心五道口,这里发生了什么?
  3. PMCAFF | O2O防刷单并没那么难,看完这些你也会反作弊
  4. laravel中单独获取一个错误信息的方法
  5. 杂七杂八(1)——如何查看本机的.NET Framework版本
  6. 大数据时代 如何让用户上网更放心
  7. 將軍苑 - 收藏集 - 掘金
  8. Web API 之SelfHost与OwinSelfHots加载外部程序
  9. KoalaUI的DateTimePicker的若干问题解答
  10. 结构体定义容易混淆的地方