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

news2024/11/15 20:09:53

在这里插入图片描述

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.coloradmin.cn/o/1656676.html

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

相关文章

揭秘抖音快速涨10000粉的方法:巨量千川投流让你轻松快速增粉

抖音已经成为了当今社交平台的热门之一,而如何快速涨粉已经成为了很多人关注的焦点。本文将揭秘一种高效的方式——巨量千川投流,通过官方真实流量和真实粉丝,每天快速涨关注,实现快速增粉1000~10万。 巨量千川投流是一种专业的抖…

proteus使用问题

1、无法和视频里面一样新建工程 2、实验效果和视频不也一样 自己的电路图(灯不亮):

vant中van-tabs使用中的小问题

1. 怎么去掉默认选中的效果 van-tabs默认情况下启用第一个标签,实际开发中不满足需求,想要点击后再进行选中 解决办法 首先,在标签组数中,添加一个占位标签在样式中设置首个标签不显示代码如下: //js 实际有意思的…

<sa8650> snapdragon-auto-hqx-4-5-6-0基线代码camera开发错误记录

<sa8650> snapdragon-auto-hqx-4-5-6-0基线代码camera开发错误记录 一、 qcxserver自启动关不掉二、 qcxserver启动后串行器(MAX96717)detect不到?三、 qcarcam_test运行后系统log提示QCarCamReserve错误四、 tuning错误导致的异常DumpCore本文主要记录CAMERA开发过程中的一…

spring框架学习记录(3)

Spring事务 Spring事务简介 事务作用:在数据层保障一系列的数据库操作同成功同失败Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功或同失败 Spring事务角色 事务管理员:发起事务方,在Spring中通常指代业务层开…

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

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

48. 旋转图像/240. 搜索二维矩阵 II

48. 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 : 输入:matrix [[5,1,9,11],[2,4,…

【STM32】西南交大嵌入式实验四:异步串行通信

实验板串行相关电路: 数码管等外设的电路前面的实验已经提到过,不再赘述。 使用cubeMX配置项目: 因为数码管,蜂鸣器这些外设对应的引脚在前面的项目里已经配置过,可以选择前面的一个项目,另存为&#xff0…

[Kubernetes] sealos部署 K8s 集群

文章目录 1.sealos 介绍2.操作系统基础配置3.安装部署 K8s4.验证 K8s 集群5.部署测试资源 1.sealos 介绍 Sealos 是一个基于 Kubernetes 内核的云操作系统发行版。它采用云原生方式,摒弃传统的云计算架构,转向以 Kubernetes 为云内核的新架构。这使得企…

【训练与预测】02 - 完整的模型验证套路

02 - 完整的模型验证套路 模型图 验证一个模型就是指使用已经训练好的模型,然后给它提供输入。 test.py import torch import torchvision from PIL import Imagedevice torch.device("cuda" if torch.cuda.is_available() else "cpu") ima…

C/C++ 初级球球大作战练手

效果演示&#xff1a; https://live.csdn.net/v/385490 游戏初始化 #include <stdbool.h> #include<stdio.h> #include<stdlib.h> #include<time.h> #include<graphics.h> #include <algorithm> #include<math.h> #include<mmsy…

飞天使-k8s知识点31-rancher的正确打开方式

文章目录 安装之前优化一下内核参数以及系统内核版本 rancher安装主要是使用以下命令nginx的配置为解决办法 安装之前优化一下内核参数以及系统内核版本 内核版本 4.17 cat > /etc/modules-load.d/iptables.conf <<EOF ip_tables iptable_filter EOF 然后重启服务器…

燃气电力瓶装气行业入户安检小程序开发

我们开发的小区业主入户安检小程序&#xff0c;旨在满足燃气、电力以及其他需要入户安检的行业需求。该程序支持自定义安检项目&#xff0c;实现线下实地安检与线上数据保存的完美结合。在安检过程中&#xff0c;我们可以拍照或录像&#xff0c;以确保安检的透明性和可追溯性&a…

亚马逊是如何铺设多个IP账号实现销量大卖的?

一、针对亚马逊平台机制&#xff0c;如何转变思路&#xff1f; 众所周知&#xff0c;一个亚马逊卖家只能够开一个账号&#xff0c;一家店铺&#xff0c;这是亚马逊平台明确规定的。平台如此严格限定&#xff0c;为的就是保护卖家&#xff0c;防止卖家重复铺货销售相同的产品&a…

Python | Leetcode Python题解之第75题颜色分类

题目&#xff1a; 题解&#xff1a; class Solution:def sortColors(self, nums: List[int]) -> None:n len(nums)p0, p2 0, n - 1i 0while i < p2:while i < p2 and nums[i] 2:nums[i], nums[p2] nums[p2], nums[i]p2 - 1if nums[i] 0:nums[i], nums[p0] num…

wePWNise:一款功能强大的红队Office宏VBA代码生成工具

关于wePWNise wePWNise是一款功能强大的Office宏VBA代码生成工具&#xff0c;该工具基于纯Python开发&#xff0c;可以帮助广大研究人员生成用于Office宏或模版的VBA代码&#xff0c;并以此来测试目标Office环境、应用程序控制和防护机制的安全性。 wePWNise的设计理念将自动化…

LNMT部署jpress

LNMT部署jpress 环境要求&#xff1a; MySQL版本5.6/5.7 tomcat版本9.0.65 源码安装MySQL5.7版 //源码安装MySQL5.7版1关闭防火墙 2创建mysql用户 3上传mysql5.7包&#xff08;https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-linux-glibc2.12-x86_64.tar.g…

向量数据库:PGVector

一、PGVector 介绍 PGVector 是一个基于 PostgreSQL 的扩展插件&#xff0c;为用户提供了一套强大的向量存储和查询的功能&#xff1a; 精确和近似最近邻搜索单精度&#xff08;Single-precision&#xff09;、半精度&#xff08;Half-precision&#xff09;、二进制&#xff…

使用动态种子的DGA:DNS流量中的意外行为

Akamai研究人员最近在域名系统&#xff08;DNS&#xff09;流量数据中观察到&#xff1a;使用动态种子的域名生成算法&#xff08;Domain Generation Algorithm&#xff0c;DGA&#xff09;的实际行为&#xff0c;与对算法进行逆向工程推测的预期行为之间存在一些差异。也就是说…

【最大公约 调和级数 并集查找】2709. 最大公约数遍历

涉及知识点 最大公约 调和级数 并集查找&#xff08;并差集) 质数、最大公约数、菲蜀定理 LeetCode 2709. 最大公约数遍历 给你一个下标从 0 开始的整数数组 nums &#xff0c;你可以在一些下标之间遍历。对于两个下标 i 和 j&#xff08;i ! j&#xff09;&#xff0c;当且…