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)中。程序被加载到内存时,操作系统会将常量区的内容加载到内存中。

  • 常量数据类型

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

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

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

相关文章

Spring底层入门(七)

1、异常处理 在DispatcherServlet中,doDispatch(HttpServletRequest request, HttpServletResponse response) 方法用于进行任务处理: 在捕获到异常后没有立刻进行处理,而是先用一个局部变量dispatchException进行记录,然后统一由…

AI电视起风,三星电视打破“隔代飞跃”,在AI纪元再次领跑

作者 | 曾响铃 文 | 响铃说 要说什么是当下最热的话题,刚落下帷幕的北京车展一定是其中之一,除了各类让人眼花缭乱的新车,纷至沓来的各界行业大佬,也让车展话题度被不断拉高。在此之外,此次车展还刮起了一股“旋风”…

A100 解析:为何它成为 AI 大模型时代的首选?

前言 NVIDIA A100 Tensor Core GPU 可针对 AI、数据分析和 HPC 应用场景,在不同规模下实现出色的加速,有效助力更高性能的弹性数据中心。A100 采用 NVIDIA Ampere 架构,是 NVIDIA 数据中心平台的引擎。A100 的性能比上一代产品提升高达 20 倍…

QT:QT与操作系统

文章目录 信号槽与事件QT多线程概述原理完成倒计时程序 UDP回显服务器服务端客户端 信号槽与事件 在之前的信号槽中,已经有了一个基本的认识,那么对于QT中事件的理解其实就非常的类似,当用户进行某种操作的时候,就会触发事件&…

CCF-Csp算法能力认证,202206-1归一化处理(C++)含解析

前言 推荐书目,在这里推荐那一本《算法笔记》(胡明),需要PDF的话,链接如下 「链接:https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码:6vdq”复制这段内容后打开手机迅雷…

欧洲杯/奥运会-云直播

欧洲杯/奥运会要来了,如何升级自己的网站让你的顾客都能观赏直播已提高用户量呢?! 【功能完善、平滑兼容】 云直播支持 RTMP 推流、 HLS 源站等多种直播源接入方式,提供直播 SDK,支持多终端适配,上行码率…

Unity之ShaderGraph入门简介与配置

前言 ShaderGraph是Unity的一个可视化着色器编辑工具,它允许开发者在不编写代码的情况下创建复杂的着色器效果。ShaderGraph提供了一个直观的图形界面,用户可以通过拖拽节点并连接它们来构建自定义的着色器。用户可以在ShaderGraph中使用各种节点,如数学运算、纹理采样、颜…

报表-接口类型的数据源

1、配置 在数据中进行如下配置 配置格式,换行的方式 #API $.data[0].children http://192.168.1.1:9200/apis/getInfo 行1:固定写法,标识这是一个接口类型的数据集 行2:JSONPath格式字符串,对接口的数据进行取值。…

Linux Ubuntu(玩客云) qBittorrent docker BT下载(qbittorrent 密码错误无法登录 ip地址被禁止登录等)

提示: 需要提前安装Docker 根据qBittorrent官网的更新日志https://www.qbittorrent.org/news ,4.6.1.0包含一个重大更新。可以看到自4.6.1.0开始,qBittorrent将弃用adminadmin默认密码,采用随机密码,将在终端控制台输出…

OpenSearch 与 Elasticsearch:7 个主要差异及如何选择

OpenSearch 与 Elasticsearch:7 个主要差异及如何选择 1. 什么是 Elasticsearch? Elasticsearch 是一个基于 Apache Lucene 构建的开源、RESTful、分布式搜索和分析引擎。它旨在处理大量数据,使其成为日志和事件数据管理的流行选择。 Elasti…

#友元函数与友元类

目录 1.概念 2.友元函数 3.友元类 1.概念 友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多 用。 友元分为:友元函数和友元类 2.友元函数 友元函数可以直接访问类的私有成员&a…

计算机网络学习记录 物理层 Day2

计算机网络学习记录 你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github https://github.com/Qiuner gitee https://gitee.com/Qiuner 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我会…

Android build.prop生成过程源码分析

Android的build.prop文件是在Android编译时刻收集的各种property【LCD density/语言/编译时间, etc.】&#xff1b;编译完成之后&#xff0c;文件生成在out/target/product/<board【OK1000】>/system/目录下&#xff1b;在Android运行时刻可以通过property_get()[c/c域] …

BI赋能金融新质生产力,16家金融机构智能BI创新实践分享

2024年政府工作报告强调&#xff0c;要“大力发展科技金融、绿色金融、普惠金融、养老金融、数字金融”&#xff0c;同时“大力推进现代化产业体系建设&#xff0c;加快发展新质生产力”。对于金融行业而言&#xff0c;培育新质生产力是高质量发展的关键着力点。金融机构可以通…

Linux学习笔记3---WSL2交叉编译

ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译&#xff0c;编译就需要编译器&#xff0c;在上一章里面已经讲解了如何在 Liux 进行 C 语言开发&#xff0c;里面使用 GCC 编译器进行代码编译&#xff0c;但使用的 gcc 编译器是针对 X86 架构的&#xff01;而…

极简—springMVC工作流程

1、流程图 2、流程 发起请求&#xff1a;客户端通过 HTTP 协议向服务器发起请求。前端控制器&#xff1a;这个请求会先到前端控制器 DispatcherServlet&#xff0c;它是整个流程的入口点&#xff0c;负责接收请求并将其分发给相应的处理器。处理器映射&#xff1a;DispatcherS…

自动控制原理学习--平衡小车的控制算法(二)

上一节 在matlab建模&#xff0c;这一节PID控制. 一、模型 直接先放一张matlab simulink的模型&#xff08;只有直线速度环和平衡环&#xff0c;串联PID&#xff09;&#xff0c;就在上一节的基础上加了两个PID。 二、PID控制 PID的好处就是可以不用动力学建模&#xff08;当…

Vue-组件中的data

一个组件的data选项必须是一个函数。保证每个组件实例&#xff0c;维护独立的一份数据对象。如下图&#xff1a; 组件一旦封装好了&#xff0c;可以使用多次&#xff0c;比如数字框组件使用了三次&#xff1a; 每次创建新的组件实例&#xff0c;都会重新执行一次data函数&#…

52. 【Android教程】网页视图:WebView

在前面的章节我们所围绕的全部都是纯客户端开发&#xff0c;我们叫 Native 开发。这样的好处就是体验和性能会非常好&#xff0c;但是在实际的使用中我们会发现存在大量的 H5 页面。这样就可以结合 Native / H5 双端的优势完成一个混合开发&#xff0c;而在这种开发模式中首当其…

windows 环境下安装《车辆动态监控系统》支持JT808、JT1078、苏标主动安全设备接入

《车辆动态监控系统》下载安装部署包 开放端口 80/443/8800&#xff0c;web后台端口&#xff0c;nginx代理服务&#xff0c;nginx默认为8800端口8808&#xff0c;JT808专用端口6802&#xff0c;视频播放推流端口6891-6898&#xff0c;FTP端口6821&#xff0c;苏标主动安全附件…