C++程序设计:C++的内存分布与管理

在这里插入图片描述

C++的内存分布与管理

    • 栈区
    • 堆区
    • 全局区
    • 代码区
    • 常量区

栈区

(1)什么是栈区?

栈区(Stack) 是用于存储函数调用,局部变量和函数参数的一种内存区域,它的特性就是先进后出(FILO)。

(2)栈区作用:

  • 管理程序函数的调用返回;

每当函数被调用时,其参数、局部变量和函数调用上下文(例如函数返回地址等)会被压入栈中。函数执行完毕后,这些数据会被从栈中弹出,控制流返回到调用者处

  • 局部变量存储

函数中声明的局部变量(即在函数内部定义的变量)通常存储在栈上。这些变量的生命周期与函数的调用周期相对应,当函数返回时,它们会自动被销毁

  • 函数参数的传递

函数的参数也被存储在栈上。当函数被调用时,参数会被压入栈中,并在函数内部使用。在函数返回时,参数会从栈中弹出

  • 函数调用的上下文保存

每次函数调用时,函数的调用上下文(例如函数返回地址、上一个函数的栈帧等)会被保存在栈上,以便在函数返回时恢复执行状态。

(3)注意

栈区大小在程序启动时就已经固定,并且在栈上分配的内存大小是静态的【系统栈大小限制】,因此不适合存储大量的数据或动态分配内存

堆区

(1)什么是堆区?

堆区(Heap),也称为自由存储区(Free Store),是程序运行时动态分配内存的一种区域。堆区的大小通常比栈大,并且在程序运行时可以动态增长或缩小。堆区的内存手动申请和释放,而不像栈区那样由编译器自动管理。

(2)堆区的作用与特点:

  • 动态内存分配

堆区允许程序在运行时动态地分配内存,以满足程序的实际需求。这种动态内存分配是通过运行时的内存管理函数(例如 new、delete 或 malloc、free)来实现的。

  • 变量的生命周期不受限制

在堆区上分配的内存不会在函数返回时被释放,而是会一直存在直到显式释放程序结束。因此,堆区上分配的内存可以跨越函数调用程序的不同部分使用。

  • 灵活性强

堆区的大小可以根据程序的需要动态调整,因此适合存储大小不确定或需要动态分配的数据结构,例如动态数组、链表等。

  • 手动管理

堆区的内存由程序员手动申请和释放,因此需要注意避免内存泄漏内存溢出的问题。程序员需要负责在不再需要某块内存时及时释放它,否则可能导致内存泄漏。

  • 非连续存储

堆区的内存分配是不连续的,内存块的分配和释放可能会导致堆内存中出现碎片化

(3)注意:

堆区的手动管理内存可能会导致内存泄漏等问题,需要注意手动释放内存

全局区

(1)什么是全局区?

全局区(Global Area)是程序中用于存储全局变量和静态变量的一块内存区域。全局区在程序启动时就会被分配,而且在程序的整个运行周期内都存在,直到程序结束。

(2)全局区的作用与特点:

  • 存储全局变量和静态变量

在全局区中,存储了程序中所有的全局变量和静态变量全局变量是在函数外部定义的变量,它们在整个程序中都是可见和可访问的;静态变量是用 static 关键字声明的局部变量或全局变量,它们的生命周期延长到程序的整个运行周期。

  • 在程序启动时分配

全局区的内存空间在程序启动时就会被分配,并且在程序运行期间一直存在,直到程序结束。因此,全局变量和静态变量的内存分配是静态的

  • 固定大小

全局区的大小是固定的,并且在编译时就已经确定。全局区的大小由编译器根据程序中定义的全局变量和静态变量的数量和大小来确定。

  • 存储位置

全局区通常位于程序的数据段(Data Segment)或者是已初始化数据段(Initialized Data Segment)中。全局变量和静态变量的存储位置是由编译器决定的。

  • 全局可见

全局变量和静态变量在整个程序中都是可见和可访问的,因此它们可以被程序的任何地方使用

代码区

(1)什么是代码区?

代码区(Code Area),也称为文本区(Text Area)或者只读区域(Read-Only Area),是存储程序执行代码的一块内存区域。代码区在程序加载到内存时就已经被分配,并且通常具有只读权限不允许对其进行写操作

(2)主要作用与特点:

  • 存储程序指令

代码区存储着程序的机器指令,包括函数体中的代码、条件语句、循环语句等等。这些指令在程序执行时被CPU依次执行,实现程序的功能。

  • 只读权限

代码区通常具有只读权限不允许对其进行写操作。这是为了保护程序的执行代码不被意外修改,以确保程序的正确性和安全性。

  • 静态分配

代码区的内存空间在程序加载到内存时就已经被静态分配,且在程序的整个执行过程中都存在。因此,代码区的大小在程序运行期间是固定的,不会动态增长或缩小

  • 存储位置

代码区通常位于程序的只读内存区域,例如在可执行文件(.exe)或共享库文件(.dll)中。程序被加载到内存时,操作系统会将代码区的内容加载到内存中

  • 执行代码

程序的执行是通过从代码区加载指令并执行这些指令来实现的。CPU会按照代码区中的指令顺序执行程序,从而完成程序的各项功能。

常量区

(1)什么是常量区?

常量区(Constant Area),也称为只读数据区(Read-Only Data Area)或者数据段(Data Segment),是存储程序中常量数据的一块内存区域。常量区在程序加载到内存时就会被分配,并且通常具有只读权限不允许对其进行写操作

(2)作用和特点:

  • 存储常量数据

常量区用于存储程序中的常量数据,包括字符串常量、全局常量和静态常量等。这些常量数据在程序运行期间保持不变,因此存储在常量区。

  • 只读权限

常量区通常具有只读权限,不允许对其进行写操作。这是为了保护程序中的常量数据不被修改,确保程序的正确性和安全性。

  • 静态分配

常量区的内存空间在程序加载到内存时就已经被静态分配,且在程序的整个执行过程中都存在。因此,常量区的大小在程序运行期间是固定的,不会动态增长或缩小

  • 存储位置

常量区通常位于程序的只读内存区域,例如在可执行文件(.exe)或共享库文件(.dll)中。程序被加载到内存时,操作系统会将常量区的内容加载到内存中。

  • 常量数据类型

常量区中的数据类型包括字符串、整数、浮点数等,这些数据在程序运行期间保持不变,因此存储在常量区。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ES数据存储与查询基本原理

Elasticsearch(ES)简介 Elasticsearch(ES)是一个分布式、可扩展、近实时的搜索和分析引擎,它基于Lucene,设计用于云计算中,处理大规模文档检索和数据分析任务,常用于实现内部搜索引…

【LAMMPS学习】八、基础知识(5.7)Drude感应偶极子

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

记录PR学习查漏补缺(持续补充中。。。)

记录PR学习查漏补缺 常用快捷键文件编辑素材序列标记字幕窗口帮助 效果基本3D高斯模糊查找边缘色彩颜色平衡超级键马赛克中间值变形稳定器轨道遮罩键 常用 快捷键 注意:比较常用的用红色字体显示 文件 快捷键作用Ctrl Alt N新建项目Ctrl O打开项目Ctrl I导入…

Samsung三星NP930XCJ-K01CN笔记本原厂Win10系统安装包下载

三星SAMSUNG笔记本电脑原装出厂Windows10预装OEM系统,恢复开箱状态自带系统 链接:https://pan.baidu.com/s/1Y3576Tsp8MtDxIpJGDucbA?pwdt0ox 提取码:t0ox 三星原装W10系统自带声卡,网卡,显卡,指纹,蓝牙等所有驱动、三星出厂主题专用壁纸…

以太网基础-IP、ICMP、ARP协议

一、IP协议 参考:rfc791.txt.pdf (rfc-editor.org) IP协议(Internet Protocol)是TCP/IP协议族中最核心的协议,提供不可靠的、无连接的、尽力而为的数据报传输服务。 IP报文数据头如下 Version:4bit,4表示…

上位机图像处理和嵌入式模块部署(树莓派4b和qt应用全屏占有)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 我们都知道,嵌入式应用一般都是为了某一个特定应用而存在的。也就是说,和pc不同,这个嵌入式板子一般都是为了解…

关于YOLO8学习(二)数据集收集,处理

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 简介 本文将会讲解: (1)如何通过三方网站,获取可用于训练的数据源 (2)通过三方网址,选择合适的手机,通过手动标注,转换为可用于训练的数据源 开发环境 win10、python 3.11、cmake、pytorch2.0.1+cu117…

大厂案例 - 通用的三方接口调用方案设计(中)

文章目录 Pre阿里云华为云【AK和SK生成方案】最佳实践1. 创建API密钥管理系统2. 生成AK和SK3. 存储和管理AK和SK4. 提供API密钥分发机制5. 安全性6. 其他注意事项 DB Model Design表结构Next考虑其他建议 API接口设计指导1. 使用POST作为接口请求方式2. 客户端IP白名单3. 单个接…

[C++核心编程-02]----C++引用详解和使用方法分析

前言 在C中,引用是一个别名,它允许将一个已存在的变量或对象用不同的名称来访问。引用在定义时必须初始化,并且一旦初始化就不能再绑定其他对象,因此引用在声明时被初始化后就不能再改变引用对象。引用使用&符号进行声明。 引…

Game Theory In Competitive Programming|Part1 (原创)

Game Theory In Competitive Programming|Part1 在算法竞赛中,博弈论是一个经常出现的题目类型。通常是两个人在给定规则下,每个人都按照最优策略进行博弈,我们的任务是找出获胜者。这通常是贪心算法、动态规划等算法的混合。下面&#xff0c…

Apache和Nginx的区别以及如何选择

近来遇到一些客户需要lnmp环境的虚拟主机,但是Hostease这边的虚拟主机都是基于Apache的,尽管二者是不同的服务器软件,但是大多数情况下,通过适当的配置和调整两者程序也是可以兼容的。 目前市面上有许多Web服务器软件,…

哈希表实现-哈希桶法

哈希桶方法 由于直接定值法实现哈希表有着明显的弊端——如果多个节点的hash值相同会往后堆积,所以衍生出哈希桶方法 我们的哈希表设置成一个结点指针数组,每个哈希值对应的是一串链表,形状就像一个一个的桶我们就会把hash值相同的节点放到一…

宝塔怎么配置nginx

宝塔怎么配置nginx 1.找到nginx配置位置 2.修改nginx.conf文件 3.重启nginx

21岁的人生赚51W!拒绝捞男捞女,翻身也要爱惜身体!——早读(逆天打工人爬取热门微信文章解读)

身体是革命的本钱 引言Python 代码第一篇 卢克文工作室 捞女在今天的中国是怎样的存在第二篇 人民日报 来啦 新闻早班车要闻社会政策 结尾 我将我的健康视为生活的基石 不会为了短暂的成功而牺牲 我珍惜身体 知道健康是实现梦想的前提 引言 这里毕竟是一个程序员的代码学习平台…

基于SpringBoot实现各省距离Excel导出实战

目录 前言 一、列表及图表信息展示 1、数据过滤调整 2、信息列表及图表展示 3、Excel写入 二、界面可视化 1、Echarts图表和列表展示 2、城市详情和下载功能设计 三、成果展示 1、图表展示 2、部分城市数据分析 总结 前言 今天是五一黄金周假期第二天,不知…

Redis(Jedis和SpringBoot整合Redis)

文章目录 1.Jedis1.介绍2.环境配置1.创建maven项目2.pom.xml引入依赖3.新建一个包并创建一个文件 3.Jedis远程连接到Redis1.Redis放到服务器可以连接的前提条件2.为Redis设置密码1.编辑配置文件2.找到 requirepass3.设置密码为root4.重启Redis,在shutdown的时候报错…

R语言实战——中国职工平均工资的变化分析——相关与回归分析

链接: R语言学习—1—将数据框中某一列数据改成行名 R语言学习—2—安德鲁斯曲线分析时间序列数据 R语言学习—3—基本操作 R语言学习—4—数据矩阵及R表示 R语言的学习—5—多元数据直观表示 R语言学习—6—多元相关与回归分析 1、源数据 各行业平均工资变化 各地区平均工资…

常用算法介绍

1. 冒泡排序:冒泡排序是一种简单的排序算法,它的基本思想是比较相邻的两个元素,如果顺序错误就交换它们的位置,直到所有元素都按照升序排列。 2. 快速排序:快速排序是一种高效的排序算法,它的基本思想是选取…

内网端口转发与代理

思路:渗透的前提是双方能够建立通信。目前无法和win7建立通信,但是拿到了windows2003的权限,所以可以在Windows2003主机上面建立节点,作为跳板机去访问到内网。 目前状态:控制win2003(IP:192.1…

基于JSP的人才公寓管理系统

目录 背景 技术简介 系统简介 界面预览 背景 随着互联网的广泛推广和应用,人才公寓管理系统在网络技术的推动下迅速进步。该系统的设计初衷是满足住户的实际需求,通过深入了解住户的期望,开发出高度定制化的人才公寓管理系统。利用互联网…