c++ 内存

c++ 内存
在这里插入图片描述

内存分区
1.代码区:程序的机器指令,可以被机器直接执行。
属性:只读和共享
代码区包含什么:
在程序编译时就已经被分配好了地址,并保存在可执行文件的代码段中。当程序运行时,操作系统会将代码段的内容读入内存,并将其中的指令加载到指令缓存器(Instruction Cache)中,以供处理器执行。
代码区的分配
代码区是在程序编译时分配的。当程序编译完成后,编译器会将程序的代码生成一个二进制文件。在程序运行时,操作系统会将该二进制文件读入内存,并将代码区的内容加载到指令缓存器(Instruction Cache)中。

2.全局区:全局变量和静态变量和字符串常量的内存区
它在程序编译时就已经被分配好了地址,并保存在可执行文件的数据段中。
全局变量能够自动初始化为0和null。全局变量在载入内存时候就被初始化了,而静态变量在首次使用时才会被初始化。
在全局数据区中定义的变量可以被程序的任何部分访问,包括全局函数、局部函数和其他模块。
在程序运行期间,全局数据区中的变量始终存在于内存中,它们的生命周期与程序的运行时间相同。

3.栈区:局部变量和函数调用时的参数、返回地址
4.堆区:new和malloc创建的

在 C++ 中,内存分配可以分为静态分配和动态分配两种方式,除了new和malloc是动态的,其他都是静态的。
使用 new 和 delete 运算符或者 malloc 和 free 函数进行动态内存分配和释放。

new:都是返回地址的指针
new 的语法格式如下:
new Type; // 分配单个对象的内存空间
new Type[N]; // 分配 N 个对象的内存空间

使用new动态分配内存并初始化基础变量时,可以使用括号初始化法来将其初始化为0,如下所示:
int* p = new int();
这样分配的内存会被初始化为0。
对于内置类型,可以使用下列语句创建并初始化元素为0的数组:
int* arr = new int10; // 创建并初始化10个元素为0的int型数组
对于指针类型,可以使用下列语句创建并初始化元素为null的数组:
int** arr = new int*10; // 创建并初始化10个指向int的指针的数组,初始值均为null
delete:释放new创建的指针指向的位置
delete 的语法如下:
delete pointer; //pointer 是之前通过 new 动态申请的内存的指针。
pointer=NULL;
delete pointer[]; //可以使用 delete[] 释放整个数组。
delete & 对象。是 C++ 中用于释放动态分配的对象的内存的运算符。而不是指针的。

运行时,将代码和数据都要加载到内存中。

1.代码段(code segment)text,存储代码。只读,存储指令。
2.数据段(data segment)存放已经初始化的全局变量和静态变量。
3.BSS段(BlockStarted by System)未初始化的全局变量和静态变量,重新启动时会将指针和值初始化为0.
4.Heap堆,malloc和calloc分配的地址。
5.stack堆栈。

静态变量和全局变量除了作用域不一样,剩下的全是相似的。
在这里插入图片描述

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

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

相关文章

Oracle的学习心得和知识总结(三十二)|Oracle数据库数据库回放功能之论文四翻译及学习

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《Oracle Database SQL Language Reference》 2、参考书籍:《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

高级自定义标记功能

高级自定义标记功能 自定义标记时用户定义的标记,它可通过创建可重用的组件来尽量较少JSP中复杂、重复的业务逻辑代码。这些组件可用于其他应用程序。Javax.servlet.jsp.tagtext包定义了开发自定义标记的类和接口。您可以使用此包的类和接口创建标记处理程序,这些程序可实现带…

【机器学习】卷积和反向传播

一、说明 自从 AlexNet 在 2012 年赢得 ImageNet 竞赛以来,卷积神经网络 (CNN) 就变得无处不在。从不起眼的 LeNet 到 ResNets 再到 DenseNets,CNN 无处不在。 您是否想知道 CNN 的反向传播中会发生什么,特别是反向传播在 CNN 中的工作原理。…

黄金交易策略(Nerve Nnife.mql4):趋势做单

完整EA:Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 当大小趋势相同行情走向也相同,就会开仓做顺势单,并会顺势追单,以达到快速止盈平仓的效果。大趋势追求稳定,小趋势追求敏捷,行情走向比小趋势更敏…

关于PLC数据采集上报,系统平台对接、设备数据转发

设备数据采集上报与系统平台对接 相关案例 PLC与SQLServer,MySQL,PostgreSQL,Oracle数据库双向通讯;HTTP协议GET/POST/PUT请求上报,解析返回数据;MQTT协议JSON/XML文件格式发布/订阅;无需…

Java图形化界面编程——弹球游戏 笔记

Java也可用于开发一些动画。所谓动画,就是间隔一定的时间(通常小于0 . 1秒 )重新绘制新的图像,两次绘制的图像之间差异较小,肉眼看起来就成了所谓的动画 。 ​ 为了实现间隔一定的时间就重新调用组件的 repaint()方法,可以借助于…

【Django】Django日志管理

Django日志管理 Django使用Python内置的logging模块处理系统日志。 1.日志框架的组成元素 Python logging 配置由下面四部分组成: Loggers Handlers 过滤器 Formatters 1.1 Loggers logger是日志系统的入口,每个 logger都是命名了的 bucket&…

一句话总结Docker与K8S的关系

一句话总结:Docker只是容器的一种,它面向的是单体,K8S可以管理多种容器,它面向的是集群,Docker可以作为一种容器方案被K8S管理。下文继续具体介绍。 1、容器的核心概念 介绍这几个核心概念:OCI、CR、Runc、…

properties

作用:可以操作配置文件;配置文件的好处: 可以把软件的设置永久化存储如果我们要修改参数,不需要改动代码,直接修改配置文件就可以了 常见的配置文件:XmL 、ini、 properties、YAML 操作后缀properties配置…

C++ Qt框架开发| 基于Qt框架开发实时成绩显示排序系统(1)

目标:旨在开发一个用户友好的软件工具,用于协助用户基于输入对象的成绩数据进行排序。该工具的特色在于,新输入的数据将以红色高亮显示,从而直观地展现出排序过程中数据变化的每一个步骤。 结果展示: 本程序是一个基于…

vue-生命周期+工程化开发(三)

生命周期 Vue 生命周期 和 生命周期的四个阶段 思考: 什么时候可以发送初始化渲染请求?(越早越好)什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期:一个Vue实例从 创建…

C#入门及进阶|数组和集合(六):集合概述

1.集合概述 数组是一组具有相同名称和类型的变量集合,但是数组初始化后就不便于再改变其大小,不能实现在程序中动态添加和删除数组元素,使数组的使用具有很多局限性。集合能解决数组存在的这个问题,下面我们来学习介绍集合…