【C++】内存分区模型

news2025/1/11 9:48:33

目录

1、缘起

2、内存分区模型

2.1、程序运行前

2.2、程序运行后 

3、总结 


1、缘起

        前几天学习完了 C++ 的 基础语法 知识点,现在终于要踏上学习 C++ 核心编程 的旅程了,期待沿途中所遇到的风景。

2、内存分区模型

C++ 程序在执行时,将内存大方向划分为 4 个区域

①  代码区:存放函数体的 二进制代码,由操作系统进行管理的

②  全局区:存放全局变量、静态变量、字符串常量和 const 修饰的全局变量(全局常量)

③  栈区:由编译器自动分配和释放,存放函数的参数值,局部变量和 const 修饰的局部变量(局部常量)等(编译器管理其生死)

  堆区由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收(程序员管理其生死)

内存四区的意义:

不同区域存放的数据,赋予不同的生命周期,给我们更大的编程灵活性。 

2.1、程序运行前

在程序编译后,生成了 exe 可执行程序,未执行该程序前分为两个区域

代码区:

        存放 CPU 执行的机器指令,

        代码区是 共享 的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可,

        代码区是 只读 的,使其只读的原因是防止程序意外地修改了它的指令。

全局区:

        全局变量和静态变量存放于此,

        全局区还包含了常量区,字符串常量和其他常量也存放于此,

        该区域的数据在程序结束后由操作系统释放。

2.2、程序运行后 

在程序运行后,又分出两个区域

栈区:

        由编译器自动分配和释放存放函数的参数值和局部变量等,

        注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

示例代码: 

#include<iostream>
using namespace std;

//栈区数据注意事项  --不要返回局部变量的地址
//栈区的数据由编译器管理开辟和释放

int* function(int b)  //形参数据也会放在栈区
{
	b = 100;
	int a = 10;  //局部变量  存放在栈区,栈区的数据在函数执行后自动释放
	return &a;  //返回局部变量的地址
}

int main()
{
	//接受 function 函数的返回值
	int* p = function(1);

	cout << *p << endl;  //第一次可以打印正确的数字,是因为编译器做了保留
	cout << endl;
	cout << *p << endl;  //第二次这个数据就不在保留了

	cout << endl;
	system("pause");
	return 0;
}

堆区: 

       堆区数据由程序员管理开辟和释放,

       堆区数据利用 new 关键字进行开辟内存。

示例代码:

#include<iostream>
using namespace std;

int* function()  
{
	//利用 new 关键字可以将数据开辟到堆区
	//指针本质也是局部变量,放在栈区,指针保存的数据是放在堆区
	int* p = new int(10);
	return p;
}

int main()
{
	//在堆区开辟数据
	int* p = function();

	cout << *p << endl;  
	cout << endl;
	cout << *p << endl;  

	cout << endl;
	system("pause");
	return 0;
}

3、总结 

        计算机程序的运行过程就像是一座 精密的工厂全局区 像是工厂的办公室,存放着程序的全局变量和静态变量,就像是管理层的决策和规划,确保整个工厂的顺利运行。代码区 则是工厂的生产线,存放着程序的指令,它们被一条条地执行,将原材料转化为成品。栈区 就像是工厂的临时存储区,存放着程序的局部变量和函数调用信息,它们的生命周期短暂,像是工人手中的工具,随时可以被使用和丢弃。堆区 则是工厂的仓库,存放着程序动态分配的内存,像是原材料的储存地,可以随时根据需要进行扩充或释放。这四个区域相互配合,构成了程序运行的基础,就像是工厂中各个部门的协同作战,共同打造出精美的产品。

        本期的分享总结就到这里了,如果有疑问的小伙伴,我们在评论区交流嗷,笔者必回,我们下期再见啦 !

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

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

相关文章

【Python Cookie 和代理 IP】零基础也能轻松掌握的学习路线与参考资料

一、Python Cookie 1、什么是Cookie&#xff1f; Cookie是一种在客户端保存数据的机制&#xff0c;服务器通过在HTTP响应头中添加Set-Cookie头实现。浏览器在接收到响应头中的Set-Cookie后&#xff0c;会将这个Cookie保存在本地。之后每次请求都会将本地保存的Cookie自动添加…

WPF插件之 - PropertyChanged.Fody插件的使用详解

总目录 文章目录 总目录一、PropertyChanged.Fody是什么&#xff1f;二、PropertyChanged.Fody的安装三、PropertyChanged.Fody的功能1. 特性1 实现属性通知的功能2 通知其他属性4 不进行属性通知3 指定属性更改时将调用的方法5 设置当前属性依赖的属性6 不检查是否相等7 DoNot…

lua:浅谈对元表和元方法的认识

前言 本篇在讲什么 浅谈对Lua元表和元方法的理解 本篇适合什么 适合初学Lua的小白 本篇需要什么 对Lua语法有简单认知 依赖Lua5.1的环境 依赖Sublime Text3编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码…

ETCD实现分布式锁

分布式锁具备特点 互斥性&#xff1a;在同一时刻&#xff0c;只有一个客户端能持有锁 安全性&#xff1a;避免死锁&#xff0c;如果某个客户端获得锁之后处理时间超过最大约定时间&#xff0c;或者持锁期间发生了故障导致无法主动释放锁&#xff0c;其持有的锁也能够被其他机制…

ANR实战案例 - FCM拉活启动优化

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、Trace日志分析二、业务分析1.Firebase源码分析2.Firebase官方查看官方文档Dem…

数据压缩新利器!小精灵ELF助你高效存储与传输

存储空间不够用&#xff1f;网络传输太慢&#xff1f;想必每个人在生活中都会遇到这些问题。看着爆满的硬盘、焦急的等待数据的接受&#xff0c;更新设备&#xff1f;不是每个人都能承担这个成本。那不如尝试一下无损压缩&#xff1f; 为了减少存储空间的占用&#xff0c;提高…

《Netty》从零开始学netty源码(五十七)之ServerBootstrap.bind()

目录 ServerBootstrap.bind()initAndRegister()init()register()doBind0() ServerBootstrap.bind() 在第一篇的HelloWorld中通过ServerBootstrap.bind()方法绑定端口号并最终启动Netty的服务&#xff0c;服务端的bind过程如下&#xff1a; 上面的代码主要分成两部分&#xff0…

【P20】JMeter XPath提取器(XPath Extractor)

文章目录 一、准备工作二、测试计划 一、准备工作 百度&#xff1a;https://www.w3school.com.cn/example/xmle/cd_catalog.xml 进入网页后&#xff0c;右键检查或按F12&#xff0c;打开调试工具 如图&#xff0c;使用XPath提取器&#xff08;XPath Extractor&#xff09;获取…

typescript学习笔记(下)

1、类型拓宽 所有通过 let 或 var 定义的变量、函数的形参、对象的非只读属性&#xff0c;如果满足指定了初始值且未显式添加类型注解的条件&#xff0c;那么它们推断出来的类型就是指定的初始值字面量类型拓宽后的类型&#xff0c;这就是字面量类型拓宽。 下面我们通过字符串…

数据结构-排序-(选择、堆排序、归并排序、基数排序)

目录 一、选择排序 二、堆排序 排序 效率分析 三、归并排序 排序 分析 四、基数排序 一、选择排序 思想&#xff1a;每趟在待排序元素中选取关键字最小的元素加入有序子列 不稳定性 空间复杂度&#xff1a;O(1) 时间复杂度&#xff1a; void swap(int &a,int &…

[Linux] 动态 / 静态库的生成与使用

文章目录 简要概念 静态库生成使用 动态库生成使用 简要概念 库一般分为两种&#xff1a; 静态库动态库 在 Linux 中&#xff1a; 如果是动态库&#xff0c;库文件是以 .so 作后缀的如果是静态库&#xff0c;库文件是以 .a 作后缀的 库文件的命名&#xff1a; libXXX.so …

RBTree

目录 红黑树的概念 红黑树性质 红黑树节点设计 红黑树的插入 红黑树的验证 红黑树和AVL树的比较 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的…

Point-SLAM: Dense Neural Point Cloud-based SLAM阅读记录

前言 只读了前半部分就感慨文章结构真的好清晰&#xff0c;从Introduction到related work完完全全都在体现它的motivation——他做了一件什么事情&#xff1f;以及为什么要这么做&#xff1f;解决了什么问题。 第一遍阅读 keywords: 以RGBD作为输入 使用点云表示场景的 dens…

【P21】JMeter XPath2 提取器(XPath2 Extractor)

文章目录 一、准备工作二、测试计划 一、准备工作 百度&#xff1a;https://www.w3school.com.cn/example/xmle/cd_catalog.xml 进入网页后&#xff0c;右键检查或按F12&#xff0c;打开调试工具 如图&#xff0c;使用XPath2 提取器&#xff08;XPath2 Extractor&#xff09;…

python 使用pandas或xlrd、xlwt实现对Excel的读取、添加、追加等一系列封装

不说了&#xff0c;又是造轮子的一天。在此我要严重批评CSDN或百度一堆浑水摸鱼的&#xff0c;某些人明明代码明显报错也来上传发博客&#xff0c;要么就是标题党&#xff0c;代码没报错但压根就不是实现那个功能的&#xff0c;简直是浪费时间。 废话不多说直接贴代码&#xff…

Linux—网络基础

目录 计算机网络背景 网络发展 认识 "协议" 网络协议初识 协议分层 OSI七层模型 TCP/IP五层(或四层)模型 网络传输基本流程 协议报头 局域网通信 网络传输流程图 局域网通信图 跨网络通信图 数据包封装和分用 网络中的地址管理 认识IP地址 认识MAC地址…

8款主流产品原型设计软件分享

在产品设计中&#xff0c;你知道如何选择合适的产品设计软件吗&#xff1f;每个产品设计软件的功能实际上是不同的&#xff0c;不同的产品设计软件应用领域是不同的。 只有深入了解每个产品设计软件的功能和主要适合该软件的行业&#xff0c;我们才能在设计相应的产品时找到合…

linux内核篇-进程及其调度

介绍一个程序从源文件到进程执行的过程 1、编译链接&#xff08;源文件到二进制文件&#xff09; Linux 下面二进制的程序也要有严格的格式&#xff0c;称为ELF&#xff08;Executeable and Linkable Format&#xff0c;可执行与可链接格式&#xff09; &#xff0c;这个格式可…

Simulink 和 Gazebo联合仿真控制机械臂【Matlab R2022a】

逛 B 站&#xff0c;偶然发现一个 up 主上传的视频&#xff0c;可以实现 Simulink 中搭建机器人的控制器设计&#xff0c;对运行在虚拟机中 Gazebo 中的机械臂进行控制&#xff0c;链接&#xff1a;三关节机械臂Gazebo-Simulink联合仿真&#xff0c;这让我很感兴趣&#xff0c;…

Web基础 ( 一 ) HTML

1.HTML <input /><input typebutton value按钮 />1.1.概念 1.1.1.HTML文件是什么 HTML表示超文本标记语言&#xff08;Hyper Text Markup Language&#xff09;, HTML文件是一个包含标记的文本文件, 必须有htm标记或者html扩展名。 可以通过浏览器(Browser)直接…