[C++ 核心编程]笔记 1 内存分区模型

news2024/10/9 7:03:07

内存分区模型

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

  • 代码区:

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

    • 存放全局变量和静态变量以及常量。
  • 栈区:

    • 由编译器自动分配释放,存放函数的参数值、局部变量等。
  • 堆区:

    • 由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

内存四区意义:

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

1.1 程序运行前

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

代码区:

  • 存放 CPU 执行的机器指令。
  • 代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。
  • 代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令。

全局区:

  • 全局变量和静态变量存放在此。
  • 全局区还包含了常量区,字符串常量和其他常量也存放在此。
  • 该区域的数据在程序结束后由操作系统释放。

1.2 程序运行后

程序一旦开始执行,内存的栈区和堆区就会被动态地管理和使用,具体如下:

栈区(Stack Segment):

  • 栈区是用于存放函数的参数值、局部变量等信息的内存区域。
  • 栈内存的分配和释放是由编译器自动完成的,遵循后进先出(LIFO)的原则。
  • 注意事项:
    • 不要返回局部变量的地址,因为局部变量在函数调用结束后就会被销毁,其地址将变得无效。
    • 栈区开辟的数据由编译器自动释放,因此程序员不需要手动管理栈内存。
    • 栈的大小通常是有限的,如果函数调用太深或局部变量占用太多内存,可能会导致栈溢出。

堆区(Heap Segment):

  • 堆区是程序在运行时动态分配内存的区域,由程序员手动控制。
  • 在C++中,通常使用new操作符在堆区开辟内存,使用delete操作符来释放内存。
  • 如果程序员没有释放堆内存,这部分内存将在程序结束时由操作系统回收,但在程序运行期间,这可能导致内存泄漏,即内存被分配后却不再使用且无法回收。
  • 堆的大小受限于系统虚拟内存的限制,理论上比栈要大得多,但是过多的堆内存分配也可能导致性能问题或内存不足。




    下面是示例代码 :
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//全局变量
int g_a = 10;
int g_b = 10;

const int c_g_a = 10;
const int c_g_b = 10;


int main() {
	//全局区
	//全局变量/静态变量/常量

	//创建普通局部变量
	int a = 10;
	int b = 10;

	cout << "局部变量a的地址为: " << (int)&a << endl;
	cout << "局部变量b的地址为: " << (int)&b << endl;

	cout << "全局变量g_a的地址为:" << (int)&g_a << endl;
	cout << "全局变量g_b的地址为:" << (int)&g_b << endl;

	// 静态变量 在普通变量前面加static,属于静态变量
	static int s_a = 10;
	static int s_b = 10;
	cout << "静态变量s_a的地址为:" << (int)&s_a << endl;
	cout << "静态变量s_b的地址为:" << (int)&s_a << endl;

	//常量
	//字符串常量
	cout << "字符串常量的地址为: " << (int)&"hello world" << endl;

	//const修饰的变量
	//const修饰的全局变量, const修饰的局部变量
	cout << "全局常量 c_g_a的地址为: " << (int)&c_g_a << endl;
	cout << "全局常量 c_g_b的地址为: " << (int)&c_g_b << endl;

	const int c_l_a = 10;// c - const   g - global   l - local
	const int c_l_b = 10;

	cout << "局部常量 c_l_a的地址为: " << (int)&c_l_a << endl;
	cout << "局部常量 c_l_b的地址为: " << (int)&c_l_b << endl;

	system("pause");

}

代码运行结果如下, 可以看出, 局部变量、常量距离比较近,全局变量、常量、静态变量距离较近,可以看出局部修饰的量与全局修饰的量在不同分区

在这里插入图片描述

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

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

相关文章

Linux 之 Linux应用编程概念、文件IO、标准IO

Linux应用编程概念、文件IO、标准IO 学习任务&#xff1a; 1、 学习Linux 应用开发概念&#xff0c;什么是系统调用&#xff0c;什么是库函数 2、 学习文件IO&#xff1a;包括 read、write、open、close、lseek 3、 深入文件IO&#xff1a;错误处理、exit 等 4、 学习标准IO&a…

wsl环境下安装Ubuntu,并下载MySQL5.7

安装操作需root权限&#xff0c;切换root用户有两种方式&#xff1a; 1-通过 sudo su - &#xff0c;切换到root用户&#xff08;登录后长期有效&#xff09;。 2-在每一个命令前加上sudo&#xff0c;临时提升权限&#xff08;仅对一条命令有效&#xff09;。 1、下载apt仓库…

【网络安全】利用XSS、OAuth配置错误实现token窃取及账户接管 (ATO)

未经许可,不得转载。 文章目录 正文正文 目标:target.com 在子域sub1.target.com上,我发现了一个XSS漏洞。由于针对该子域的漏洞悬赏较低,我希望通过此漏洞将攻击升级至app.target.com,因为该子域的悬赏更高。 分析认证机制后,我发现: sub1.target.com:使用基于Cook…

解决雪花ID在前端精度丢失问题

解决雪花ID在前端精度丢失问题 在现代分布式系统中&#xff0c;雪花算法&#xff08;Snowflake&#xff09;被广泛用于生成唯一的ID。这些ID通常是Long类型的整数。然而&#xff0c;当这些ID从后端传递到前端时&#xff0c;JavaScript的精度限制可能会导致精度丢失&#xff0c…

记录:Vscode 安装插件报:提取扩展出错 phpstudy中下载服务报网络异常

昨天出现了两个莫名其妙的问题&#xff1a; 一个是在phpstudy中下载服务的时候突然报了这个错误&#xff1a;当前网络不稳定&#xff0c;下载失败 不知道什么原因&#xff0c;从来也没见过 在网上找了一圈&#xff0c;没有解决&#xff0c;就放弃了 然后在刚刚&#xff0c;像用…

Photo Sphere Viewer:探索360°全景图的JavaScript库,轻松实现360°全景展示,探索360°全景世界的神奇之旅

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 你是否曾想过将360全景图嵌入到你的网站或应用中&#xff0c;为用户带来沉浸式的体验&#xff1f;Photo Sphere Viewer可以帮助你实现这个目标&#x…

打卡第六天 P10287 [GESP样题 七级] 最长不下降子序列

今天是我打卡第六天&#xff0c;做个普及/提高−题吧(#^.^#) 原题链接&#xff1a;[GESP样题 七级] 最长不下降子序列 - 洛谷 题目描述 输入格式 输出格式 输出一行一个整数表示答案。 输入输出样例 输入 #1 5 4 2 10 6 3 1 5 2 2 3 3 1 1 4 输出 #1 3 输入 #2 6 11 …

IvorySQL 西安站活动回顾|一键了解IvorySQL新兼容性

9月7日&#xff0c;IvorySQL社区携手中国开源软件联盟PostgreSQL分会&#xff0c;在古都西安成功举办PostgreSQL技术峰会及IvorySQL西安用户组成立仪式&#xff0c;现场吸引了众多西安PG圈技术爱好者和资深开发小伙伴们的热情参与&#xff01;&#x1f44f;&#x1f44f;&#…

计算机的错误计算(一百一十七)

摘要 算式“(5^25*(1/25)^(1/5)*3^25(1/25)^(1/5)*5^25*3^(251/5)-(9/25)^(1/5)*3^25*5^25-(1/25)^(1/5)*3^25*5.0^25*(13^(1/5)-3^(2/5.0)))” 的准确值是0. 但是&#xff0c;Python 与 Excel 均输出了错误结果&#xff1a;一个含有15位整数&#xff0c;一个含有14位整数。 …

HeidiSQL 数据库密码如何恢复

有时候我们会把数据库的连接密码保存在 HeidiSQL 中&#xff0c;但随着时间的流逝&#xff0c;我们可能希望重新找回保存在 HeidiSQL 中的密码&#xff0c;但 HeidiSQL 中保存的密码是无法被复制的。 这时候&#xff0c;我们需要想办法找到原始的密码。 加密算法 HeidiSQL 中…

多模态方法总结

多模态方法总结 架构分为Transformer Encoder的方法和基于Transformer Encoder和Decoder的方法 Transfomer Encoder方法 这张图来源于VILT&#xff0c;基本概括了多模态领域的模型架构。 图a是VSE或VSE的架构&#xff0c;文本端进行一个轻量的word embedding&#xff0c;视觉…

GNURadio 平台实现FM信号调制解调

一、FM 信号调制信号流图 波形图&#xff1a; 红色是已调制的FM信号&#xff0c;蓝色是调制信号波形。 频谱图&#xff1a; 瀑布图&#xff1a; 二、FM 信号解调信号流图 解调信号波形&#xff1a; 解调信号频谱&#xff1a; 具体可以通过audio sink 模块听音分析是否解调准确…

无人机高精度地形测量技术详解!

一、无人机技术 无人机作为搭载各种高精度传感器的平台&#xff0c;能够在不同高度和角度进行灵活飞行&#xff0c;覆盖各种复杂地形和环境&#xff0c;实现地表信息的全方位获取。 二、高精度传感器技术 GPS/GLONASS等卫星定位系统&#xff1a;无人机通过卫星定位系统实现高…

怎样查局域网里的所有ip?

如果想高效管理网络设备&#xff0c;识别配置、更新和维护各类连接设备&#xff0c;排查网络故障&#xff0c;提升网络安全性&#xff0c;监控异常 IP 活动&#xff0c;发现潜在威胁等需要知道局域网。那么怎样查局域网里的所有ip呢&#xff1f; 一、局域网IP是什么&#xff1…

最新免费GPT4O和Midjourney

一、什么是GPT4O&#xff1f; GPT-4 是 OpenAI 研发的大型语言模型。它具有强大的语言理解和生成能力&#xff0c;在自然语言处理等诸多领域有着广泛的应用和表现。 二、什么是Midjourney&#xff1f; Midjourney 是一款人工智能图像生成工具。它可以根据用户输入的描述或提…

LeetCode-2608. 图中的最短环【广度优先搜索 图,腾讯面试真题】

LeetCode-2608. 图中的最短环【广度优先搜索 图&#xff0c;腾讯面试真题】 题目描述&#xff1a;解题思路一&#xff1a;【一图秒懂】枚举起点跑 BFS解题思路二&#xff1a;背诵版解题思路三&#xff1a; 题目描述&#xff1a; 现有一个含 n 个顶点的 双向 图&#xff0c;每个…

anndata复制问题

感觉这个问题就很复杂哈&#xff0c;摸不清什么规律&#xff0c;只能判断前后的维度变化了 example 1 import scanpy as sc adata1 sc.read(/Users/yxkang/Desktop/dataset/HER2/H5AD_file/ad_H1.h5ad) print(adata1)adata2 sc.read(/Users/yxkang/Desktop/dataset/HER2/H5…

【AI学习】Mamba学习(五):《HiPPO: Recurrent Memory with Optimal Polynomial Projections》

SSM之后&#xff0c;就需要接着学习HiPPO了。 《HiPPO: Recurrent Memory with Optimal Polynomial Projections》 论文地址&#xff1a;https://arxiv.org/abs/2008.07669 摘要 从连续数据中学习的一个核心问题是&#xff0c;随着更多数据的处理&#xff0c;以增量方式表示累…

OWASP发布大模型安全风险与应对策略(QA测试重点关注)

开放式 Web 应用程序安全项目&#xff08;OWASP&#xff09;发布了关于大模型应用的安全风险&#xff0c;这些风险不仅包括传统的沙盒逃逸、代码执行和鉴权不当等安全风险&#xff0c;还涉及提示注入、对话数据泄露和数据投毒等人工智能特有的安全风险。 帮助开发者和测试同学更…

面试不是一场遭遇战

引言 Ethan第一次跳槽时&#xff0c;把工作总结搞成简历&#xff0c;丢到BOSS&#xff0c;面了几场&#xff0c;结果都很糟。复盘下来&#xff0c;发现面试过程临场发挥太多&#xff0c;把攻坚战打成了遭遇战。 那面试要如何准备&#xff1f;什么情况下跳槽&#xff1f;有哪些大…