C++用new创建对象和不用new创建对象的区别解析

我们都知道C++中有三种创建对象的方法,如下:

#include <iostream> using namespace std; class A { private: int n; public: A(int m):n(m) { } ~A(){} }; int main() { A a(1); //栈中分配 A b = A(1); //栈中分配 A* c = new A(1); //堆中分配 delete c; return 0; }

第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存,而第三种使用了new,在堆中分配了内存,而栈中内存的分配和释放是由系统管理,而堆中内存的分配和释放必须由程序员手动释放。

所以这就产生一个问题是把对象放在栈中还是放在堆中的问题,这个问题又和堆和栈本身的区别有关:

这里面有几个问题:

1.堆和栈最大可分配的内存的大小

2.堆和栈的内存管理方式

3.堆和栈的分配效率

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

其次针对第二个问题,栈是系统数据结构,对于进程/线程是唯一的,它的分配与释放由操作系统来维护,不需要开发者来管理。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储单元会被自动释放。栈内存分配运算内置于处理器的指令集中,效率很高,不同的操作系统对栈都有一定的限制。

堆上的内存分配,亦称动态内存分配。程序在运行的期间用malloc申请的内存,这部分内存由程序员自己负责管理,其生存期由开发者决定:在何时分配,分配多少,并在何时用free来释放该内存。这是唯一可以由开发者参与管理的内存。使用的好坏直接决定系统的性能和稳定。

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

最后针对第三个问题,栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率 比较高。

堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在 堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会 分 到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

由上可知,能用栈则用栈。

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

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

相关文章

仓库管理的五大环节,你都做到位了吗?

目录 一、入库 1、要提前准备 2、验收核对 3、遇到异常情况怎么办&#xff1f; 4、及时录入 二、出库 1、审核单据 2、高效拣货 3、复核 4、交接时要留痕 三、盘点 1、提前做准备 2、盘点方法 3、执行规范 4、差异处理 四、存储 第一是分区分类 第二是先进先…

自考必看!8个高效降AIGC工具推荐

自考必看&#xff01;8个高效降AIGC工具推荐 AI降重工具&#xff1a;自考论文的“隐形护盾” 在自考论文写作过程中&#xff0c;越来越多的学生开始关注“AIGC率”和“查重率”的问题。随着人工智能技术的广泛应用&#xff0c;许多学生在使用AI生成内容时&#xff0c;发现论文中…

事务ACID特性详解

一、ACID基本概念 1. 原子性&#xff08;Atomicity&#xff09; 定义&#xff1a;事务的所有操作要么全部完成&#xff0c;要么全部不完成&#xff0c;不会停留在中间状态 比喻&#xff1a;就像银行转账&#xff0c;A账户扣款和B账户入账必须同时成功或同时失败 实现机制&am…

含光热电站、有机有机朗肯循环、P2G的综合能源优化调度附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

计算机深度学习毕设实战-基于 人工智能深度学习算法训练数字识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

学长亲荐2026专科生必备10款AI论文写作软件测评

学长亲荐2026专科生必备10款AI论文写作软件测评 2026年专科生论文写作工具测评&#xff1a;为何值得一看 随着人工智能技术的不断进步&#xff0c;AI论文写作工具逐渐成为大学生&#xff0c;尤其是专科生群体中不可或缺的辅助工具。然而&#xff0c;面对市场上琳琅满目的软件选…

含氢气氨气综合能源系统优化调度研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

【课程设计/毕业设计】基于机器学习深度学习算法训练数字识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Spring 三级缓存详解

Spring 的三级缓存是解决单例Bean循环依赖的核心机制。理解三级缓存对于掌握Spring的Bean创建过程至关重要。一、三级缓存定义与作用三级缓存的含义// 在 DefaultSingletonBeanRegistry 中定义 public class DefaultSingletonBeanRegistry extends ... {// 一级缓存&#xff1a…

2025金三银四:大模型训练岗年薪百万技术栈揭秘,非常详细收藏我这一篇就够了!

​​摘要​​ 2025年大模型训练岗位校招薪资峰值突破​​180万​​&#xff08;OpenAI中国研究院Offer&#xff09;&#xff0c;较算法工程师均值高出​​300%​​。本文基于猎聘/脉脉35家头部企业招聘数据&#xff0c;深度解析百万年薪背后的​​技术能力图谱​​&#xff1a;…

前端Vue开发环境搭建(安装Node.js)

一、官网下载Node.js下载地址https://nodejs.org/zh-cn​​​​二、测试安装是否成功在键盘按下【winR】键&#xff0c;输入cmd&#xff0c;然后回车&#xff0c;打开cmd窗口分别输入node -v和npm -v&#xff0c;测试安装是否成功&#xff08;Node.js已经整合了npm&#xff09;…

Azure Dataverse 权限设计学习

1. 创建表 https://make.powerapps.com/ 2. 管理员配置权限端 https://admin.powerplatform.microsoft.com/ 3 Dataverse 权限设计 业务部门 -> 相当于组织架构 团队 -> 组织架构的分组权限&#xff0c;可以把业务部门下的人员放在多个团队 用户 -> 职员 角色 -…

分布式事务原理及实际业务场景详解

一、分布式事务基础概念1.1 什么是分布式事务&#xff1f;分布式事务是指跨多个数据库、服务或系统的操作序列&#xff0c;这些操作作为一个整体&#xff0c;要么全部成功&#xff0c;要么全部失败&#xff0c;保证数据的一致性。1.2 本地事务 vs 分布式事务维度本地事务分布式…

基于JAVA框架的学生宿舍寝室报修管理系统的设计与实现应用和研究

文章目录摘要项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着高校规模的扩大和学生人数的增加&#xff0c;宿舍设施的维护与管理成为一项重要任务。传…

【SCI复现】基于RSSA算法的冷热电联供型微网优化调度附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1…

车辆GPS数据实战方案:SpringBoot + Kafka + Redis + MongoDB 全栈实现

1. 系统架构设计 1.1 整体架构 车辆终端 → SpringBoot接入层 → Kafka消息队列 → 数据处理层 → MongoDB存储 + Redis缓存 1.2 技术栈选择理由 技术 作用 选择理由 SpringBoot 接入层、快速开发 生态丰富、快速开发 Kafka 消息队列,高吞吐 解耦系统组件、支持顺序消息 Re…

力扣数据库——员工奖金

员工奖金https://leetcode.cn/problems/employee-bonus/ 一 题目 表&#xff1a;Employee Column NameTypeempIdintnamevarcharsupervisorintsalaryint empId 是该表中具有唯一值的列。该表的每一行都表示员工的 id 和姓名&#xff0c;以及他们经理的 id 和他们的工资。表…

基于Java的心理咨询在线评测系统设计与开发应用和研究

文章目录心理咨询在线评测系统设计与开发摘要项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;心理咨询在线评测系统设计与开发摘要 该系统基于Java技术栈开发&…

毫米波V2I网络的链路层仿真研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

把智能体当“新员工“带:一文搞懂大模型智能体运作流程

文章通过将智能体比作新员工的形象比喻&#xff0c;揭示了智能体的运作流程&#xff1a;首先通过系统提示词设定角色和基本信息&#xff0c;然后配置工具让智能体使用。智能体会尝试解决问题&#xff0c;但结果可能不完善&#xff0c;需要根据反馈优化。ReAct Agent模型通过规划…