当前位置: 首页 > news >正文

C++学习笔记(三十二):c++ 堆内存与栈内存比较

本节对堆和栈内存进行描述。

  • 应用程序启动后,操作系统将整个程序加载到内存,分配相应的物理ram,确保程序可以正常运行。堆和栈是ram中存在的两个区域。栈通常是一个预定义大小的内存区域,一般是2M字节左右。堆也是预定了默认值的区域,但可以随着程序的运行变大。
  • #include <iostream>struct Vector3
    {float x, y, z;Vector3():x(1),y(2),z(3){}
    };int main()
    {//在栈上分配内存int value = 5;   //整数int array[5];    //数组for (int i = 0; i < 5; i++){array[i] = i;}Vector3 vector;  //类或者结构体//在堆上分配,使用new操作符在堆上进行分配int* hvalue = new int;*hvalue = 5;int* harray = new int[5];for (int i = 0; i < 5; i++){harray[i] = i+5;}Vector3* hvector = new Vector3;std::cin.get();
    }

  • 栈内存分配
  • 下图是展示的内存地址是栈上array的内存地址,可以看到,在内存上市连续的20个字节的大小,因为一个int是4字节。
  • 在array附近可以看到05 00 00 00,这是value的内存地址,中间多了一些字节是因为现在是在Debug模式下,中间添加的是安全守卫,在所有变量的周围都会添加,确保内存溢出不是改变所有变量等。
  • 继续执行,下入红色的字节表示的是vector的字节,中间插入的仍是安全守卫。
  • 堆内存分配
  • 继续执行上述程序,在内存中可以看到hvalue的值以及内存地址
  • 继续执行,查看harray的从,从下图可以看到和hvalue的内存地址相差很远。
  • 在堆中申请内存,需要程序员自己去释放内存,而在栈中,超出作用域后会自动释放内存。如下所示:
  • #include <iostream>struct Vector3
    {float x, y, z;Vector3():x(1),y(2),z(3){}
    };int main()
    {//在栈上分配内存int value = 5;   //整数int array[5];    //数组for (int i = 0; i < 5; i++){array[i] = i;}Vector3 vector;  //类或者结构体//在堆上分配,使用new操作符在堆上进行分配int* hvalue = new int;*hvalue = 5;int* harray = new int[5];for (int i = 0; i < 5; i++){harray[i] = i+5;}Vector3* hvector = new Vector3;delete hvalue;delete[] harray;delete hvector;std::cin.get();
    }
  • new操作符实际上调用了一个malloc的函数从堆上分配内存,程序会维护一个空闲链表,用来跟踪哪些内存块是空闲的。

  • 栈分配比堆分配效率高的原因
  • 在栈上分配内存仅仅是一条cpu指令,而在堆上, 需要执行很多操作,所以在栈上分配执行效率比在堆上分配高很多。下面通过查看生成的汇编代码来证实。

  • 如上图显示,在通过栈给value分配内存是,仅仅需要执行一条cpu指令。

  • 上图现在,在堆上则需要执行7条cpu指令,才能给hvalue分配内存。

  • 生成汇编的设置方法如下:

相关文章:

C++学习笔记(三十二):c++ 堆内存与栈内存比较

本节对堆和栈内存进行描述。 应用程序启动后&#xff0c;操作系统将整个程序加载到内存&#xff0c;分配相应的物理ram&#xff0c;确保程序可以正常运行。堆和栈是ram中存在的两个区域。栈通常是一个预定义大小的内存区域&#xff0c;一般是2M字节左右。堆也是预定了默认值的…...

探索Shadowsocks-Android:保护你的网络隐私

探索Shadowsocks-Android&#xff1a;保护你的网络隐私 I. 引言 在数字时代&#xff0c;网络隐私和安全变得愈发重要。我们越来越依赖互联网&#xff0c;但同时也面临着各种网络限制和监控。在这个背景下&#xff0c;Shadowsocks-Android应用程序应运而生&#xff0c;为用户提…...

蓝桥杯练习题(二)

&#x1f4d1;前言 本文主要是【算法】——蓝桥杯练习题&#xff08;二&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …...

将文本文件导入Oracle数据库的简便方法:SQL Developer

需求 我有一个文本文件dbim.txt&#xff0c;是通过alert log生成的&#xff0c;内容如下&#xff1a; 2020-09-11 2020-09-11 ... 2023-12-03 2023-12-03 2023-12-26我已经在Oracle数据库中建立了目标表&#xff1a; create table dbim(a varchar(16));我想把日志文件导入Or…...

Mac iTerm2 配置

Mac iTerm2 配置 安装 brew install iTerm2安装完成之后&#xff0c;需要重新打开终端&#xff0c;既可以看见安装 iTerm2 的效果。 iTerm2 美化 使用 oh-my-zsh 美化 iTerm2 终端 安装 brew install wget sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/mast…...

R语言下载安装及VScode配置

文章目录 1. R 下载和安装1.1 下载1.2 安装 2. VSCODE 配置2.1 安装R拓展2.2 安装R语言辅助功能包2.3 DEBUG 1. R 下载和安装 1.1 下载 网址&#xff1a;https://www.r-project.org/ 选择一个镜像地址下载 选择对应的版本 一般选择base即可 1.2 安装 下载安装包后按提示安装…...

【hyperledger-fabric】部署Java应用远程访问智能合约

简介 首先是根据b站的视频 hyperledger-fabric【3】在 java 应用中访问合约 以及hyperledger-fabric【5】Java应用和私有数据&#xff0c;本文章主要讲述的是视频中我遇到的问题&#xff0c;以及相关知识点的总结。 遇到的问题 问题1&#xff1a;git clone下载下来的代码发现…...

SpringBoot 调用mybatis报错:Invalid bound statement (not found):

启动SpringBoot报错&#xff1a;Invalid bound statement (not found): 参考此文排查 命中了第6条 记录一手坑爹的Invalid bound statement (not found)&#xff08;六个方面&#xff09; mapper文件路径配置错误 订正以后 问题解决...

PHP开发日志 ━━ 不同方法判断某个数组中是否存在指定的键名,测试哪种方法效率高

我们可以用isset($arr[a]) 或者 array_key_exists(a, $arr) 来判断a键名是否存在与$arr数组。 那么这两种方式哪个运行速度快呢&#xff1f; 不多废话了&#xff0c;现在我们写一段代码来测试一下&#xff1a; $array [a > 1, b > 2, c > 3];$start microtime(tru…...

【pytorch学习】 深度学习 教程 and 实战

pytorch编程实战博主&#xff1a;https://github.com/lucidrains https://github.com/lucidrains/vit-pytorch...

js中和Vue中的事件委托(事件代理)的实现方法

目录 一、事件委托&#xff08;事件代理&#xff09; 1、事件委托的优点 2、事件委托的缺点 3、为什么要使用事件委托 4、事件委托实现原理 5、DOM事件流 6、事件委托的实现方法 1、vue写法 1.1、html代码 1.2、js代码 2、原生的写法其实也差不多&#xff1a; 2.1、…...

C++学习笔记——对象的指针

目录 一、对象的指针 二、减少对象的复制开销 三、应用案例 游戏引擎 图像处理库 数据库管理系统 航空航天软件 金融交易系统 四、代码的案例应用 一、对象的指针 是一种常用的技术&#xff0c;用于处理对象的动态分配和管理。使用对象的指针可以实现以下几个方面的功…...

QT5.14 实现ModbusTCP客户端 Demo

本文在QT5.14平台&#xff0c;基于QModbusClientTcp类&#xff0c;实现了客户端对单个寄存器的读写&#xff0c;用ModbusSlave做服务器做测试。 1.界面 (1)更改读按钮的名称为bt_Read (2)更改写按钮的名称为bt_Write 2.修改pro文件的第三行 greaterThan(QT_MAJOR_VERSION, 4)…...

c++析构函数

析构函数的简述 1. 析构函数和构造函数类似&#xff0c;是c规定当对象的生命周期结束时&#xff0c;默认你会调用析构函数。 2. 同理&#xff0c;当我们不写析构函数的时候&#xff0c;编译器会自动生成一个空实现的析构函数。 3. 析构函数只能编译器自己调用&#xff0c;我们…...

nodejs 服务端token 高效缓存验证

在前后端分离开发过程中,经常涉及权限验证的问题,一般都是采用由服务端根据前端传递的用户名和密码,验证成功后生成token,然后前端在访问服务端接口时,再附带token访问。 如果服务端高频次的解析token,进行内容验证,则会大大降低接口性能,而采用内存或者redis进行合法…...

C++内存管理机制(侯捷)笔记2

C内存管理机制&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youtube: 侯捷-C内存管理机制 Github课程视频、PPT和源代码: https://github.com/ZachL1/Bilibili-plus 下面是第二讲allocator具体实…...

java基础之异常练习题

异常 1.Java 中所有的错误/异常都继承自 Throwable类&#xff1b;在该类的子类中&#xff0c; Error 类表示严重的底层错误&#xff0c; 对于这类错误一般处理的方式是 直接报告并终止程序 &#xff1b; Exception 类表示异常。 2.查阅API&#xff0c;完成以下填空&#xff1a;…...

智慧旅游景区解决方案:PPT全文49页,附下载

关键词&#xff1a;智慧景区建设&#xff0c;智慧旅游平台&#xff0c;智慧旅游运营检测系统项目&#xff0c;智慧文旅&#xff0c;智慧景区开发与管理&#xff0c;智慧景区建设核心&#xff0c;智慧景区开发与管理 一、智慧景区建设现状 1、基础设施建设&#xff1a;智慧景区…...

Demo: 给图片添加自定义水印并下载

给图片添加自定义水印并下载 <template><div class"wrap"><div class"optea"><div class"file-upload"><p>选择图片</p><el-button type"text" style"color: #c00;"><label f…...

黑马苍穹外卖学习Day5

文章目录 Redis学习Redis简介准备工作Redis常用数据类型介绍各数据类型的特点Redis常用命令字符串操作命令哈希操作命令列表操作命令集合操作命令有序集合操作命令通用操作命令 在Java中操作Redis导入Spring Data Redis坐标配置Redis数据源编写配置类&#xff0c;创建RedisTemp…...

观察 Taotoken 在多地域请求下的延迟与稳定性表现

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察 Taotoken 在多地域请求下的延迟与稳定性表现 对于依赖大模型 API 进行开发的团队而言&#xff0c;服务的延迟与稳定性是影响开…...

基于Adafruit FLORA的红外遥控胸针DIY:从嵌入式编程到可穿戴艺术

1. 项目概述&#xff1a;一个藏在时尚配饰里的“电视终结者”几年前&#xff0c;我在一个朋友聚会上&#xff0c;发现大家明明在聊天&#xff0c;眼睛却总是不自觉地瞟向角落里那个正在播放无聊广告的电视。直接走过去关掉显得有点突兀&#xff0c;找遥控器又太麻烦。那一刻我就…...

模拟IC设计避坑指南:用Cadence Virtuoso仿真,揭秘电流镜精度下降的3个元凶

模拟IC设计避坑指南&#xff1a;用Cadence Virtuoso仿真&#xff0c;揭秘电流镜精度下降的3个元凶 在模拟CMOS集成电路设计中&#xff0c;电流镜作为基础模块广泛应用于偏置电路、有源负载等场景。然而许多工程师在Cadence Virtuoso IC617中完成电流镜设计后&#xff0c;常会遇…...

MemPrivacy:面向端云智能体的隐私保护个性化记忆管理框架

之前文章介绍过&#xff1a;89.2%攻击成功率&#xff01;腾讯、字节研究发现 OpenClaw Agent 存在可利用结构性漏洞 今天介绍一个 MemPrivacy 项目&#xff0c;来自 MemTensor、荣耀和同济大学的联合团队。 他们的研究让云端智能体能正常"记住你"&#xff0c;但永远看…...

OpenCore Legacy Patcher终极指南:让老Mac免费运行最新macOS的完整教程

OpenCore Legacy Patcher终极指南&#xff1a;让老Mac免费运行最新macOS的完整教程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是…...

终极指南:如何在Mac上免费备份和导出微信聊天记录

终极指南&#xff1a;如何在Mac上免费备份和导出微信聊天记录 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因误删重要微信聊天记录而懊恼&#xff1f;或是需要…...

【稀缺首发】Midjourney达达主义风格提示工程白皮书:含89组对比实验数据+12个独家种子编号(限前500名下载)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;达达主义在AI图像生成中的哲学解构 达达主义并非技术流派&#xff0c;而是一场对逻辑、秩序与意义权威的激进质疑——这一精神正悄然渗透至当代AI图像生成的核心机制中。当Stable Diffusion接收“一只会…...

Python自动化Excel数据抓取:OpenClaw技能实战指南

1. 项目概述&#xff1a;从Excel表格到智能数据抓取如果你每天的工作都离不开Excel&#xff0c;并且经常需要从各种网页、文档甚至PDF里手动复制粘贴数据&#xff0c;然后费劲地整理到表格里&#xff0c;那你一定对“Excel大师”这个称号既向往又头疼。我们总希望Excel能更“聪…...

百度网盘直链解析终极指南:如何实现高速下载的完整技术方案

百度网盘直链解析终极指南&#xff1a;如何实现高速下载的完整技术方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在云存储服务普及的今天&#xff0c;百度网盘作为国内用…...

期权交易基础框架:模块化设计与Python实现指南

1. 项目概述&#xff1a;一个为期权交易者打造的“乐高积木”底座如果你在量化交易或者期权策略开发领域摸爬滚打过一段时间&#xff0c;大概率会遇到一个共同的痛点&#xff1a;策略想法很多&#xff0c;但把它们变成可回测、可实盘、可管理的代码&#xff0c;却要耗费大量的“…...