【C/C++】理解C++内存与Linux虚拟地址空间的关系---带你通透C++中所有数据


每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry”

绪论:
本质编写的原因是我在复习过程中突然发现虚拟地址空间和C++内存划分我好想有点分不清时,进行查询各类资料和整理各类文章后得出的文章,本质是为了让我对Linux底层系框架有更好的理解和对C++语言和Linux系统的关系更近一步。
——————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。


C/C++内存区域划分:

在C/C++中他的内存区域划分,由上而下主要由一下分构成:

  1. 栈区:它主要存储着局部域中的局部变量和函数调用信息(如函数参数、返回地址等)
  2. 堆区:它主要存储着给用户动态分配的内存空间(通过:malloc,free,new,delete 申请/释放)
  3. 静态区:它主要存储着全局变量和静态变量
  4. 常量区:顾名思义存储着常量和常量字符串已经可执行的代码

通过下面这张图来快速的理解和练习巩固记忆:
在这里插入图片描述

进程的虚拟地址空间

对于虚拟地址空间来说它的区间划分如下图:
不难发现其实和C++中的差不多,其中不同的是在Linux中:

  1. 静态区被称为数据段:同样存储的是进程的静态变量和全局变量
  2. 常量区被称为代码段:主要可以理解成它存储着可执行程序的代码以及代码中的常量
  3. 还多了两个:
  4. 内核空间:是留给操作系统内核使用的,一般来说用于处理一些底层系统服务、硬件操作
  5. 内存映射区(包含共享区):是指多个进程可以共享的一块内存区域,常见于共享库文件或特定数据段。其主要作用包括
    在这里插入图片描述

内存映射区(共享区)的细节:

  • 内存映射区是一个描述过程,指的是操作系统将物理内存划分并映射到虚拟地址空间中的不同区域。
  • 这个过程涉及将物理内存分配到内核空间、用户空间和共享区等不同区域。

内存映射区:

  1. 内存映射区涵盖了整个虚拟地址空间的划分,包括内核空间、用户空间和共享区等。
  2. 确保每个进程只能访问分配给它的内存区域,防止内核内存被用户程序访问。
  3. 通过段表和页表机制将物理内存映射到虚拟地址空间,实现内存的高效管理和保护
  4. 它是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
  5. 还能创建共享共享内存,做进程间通信。

共享区:

  1. 共享区是操作系统中允许多个进程共享相同内存区域的部分,通常用于共享库文件或特定数据段。
  • 它位于用户空间,并通过特定的机制确保多个进程能够协同使用这些内存区域。
  • 如下图:磁盘中的库通过物理地址加载到虚拟地址空间中的内存映射区

右下角的图来说就是:内存映射区的映射关系,每当一次和物理内存的交互就会生成一段映射区间(此处是线程的内存分配、管理和隔离中的一些和内核有关的属性)
在这里插入图片描述

总结

C++内存和Linux虚拟地址空间的关系是非常密切的,他们不同的在于Linux进程中多了一些其他的区域(内存映射区、内核空间),方便操作系统的操作!


本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量C++细致内容,早关注不迷路。

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

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

相关文章

美国国防部(DoD)SysML v2迁移指南项目

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 分享一篇SysML v1向SysML v2迁移的资料。 下载地址:https://ndia.dtic.mil/wp-content/uploads/2023/systems/Thurs_1560710_Stirk.pdf 核心内容用DeepSeek整理如下&#…

在vscode中编译运行c语言文件,配置并运行OpenMP多线程并行程序设计

1.下载安装vscode Visual Studio Code - Code Editing. Redefined 2.安装vscode扩展 打开vscode,按ctrl+shift+x,打开扩展,搜索c/c++,下载相应的扩展 3.下载MinGW-w64 MinGW-w64 提供了 GNU 编译器集合,可以编译c/c++文件 这里下载见我的资源,可直接下载 把压缩包解压…

Jenkins protoc: command not found

个人博客地址:Jenkins protoc: command not found | 一张假钞的真实世界 在使用Jenkins编译Hadoop3.1.2时报错信息如下: [INFO] --- hadoop-maven-plugins:3.1.2:protoc (compile-protoc) hadoop-common --- [WARNING] [protoc, --version] failed: j…

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机 前言一、使用命令行(nmcli 命令)配置网络,配置主机名第一步第二步修改主机名称 二、使用图形化界面(nmtui 命令)配…

【CMake 教程】基础使用教程(一)

一、准备 1. CMake 官方下载网址 2. 文件目录结构 MySimpleProject ├── CMakeLists.txt # CMake 配置文件 └── main.cpp # 主程序源码我们在 MySimpleProject 目录中创建 CMakeLists.txt 和 main.cpp 两个空白文件。 二、CMake 简单概念 要学会使用 CMake&#xff…

智能网络感知,打造极致流畅的鸿蒙原生版中国移动云盘图文体验

背景 中国移动云盘(原“和彩云网盘”)是中国移动重磅推出的安全、智能、不限速、移动用户免流的智能云盘,致力于成为5G时代用户个人与家庭的数字资产管理中心,是中国移动继语音、短信、流量后的“第四项基础服务”。 照片、音视…

Windows 11【1001问】Windows 11系统硬件配置要求

Windows 11 的设计目标是让用户更贴近自己喜欢的内容,在其发布之际,计算机在连接、创作以及游戏体验方面扮演了更加核心的角色。在设定 Windows 11 的最低系统要求时,我们依据三个关键原则来指导决策,以确保用户能够获得卓越的使用…

SQL笔记#函数、谓词、CASE表达式

目录 一、各种各样的函数 1、函数的种类 2、算术函数 ABS——绝对值 MOD——取余 ROUND——四舍五入 3、字符串函数 ||——拼接 LENGTH——字符串长度 LOWER——小写转换 REPLACE——字符串的替换 SUBSTR——字符串的截取 UPPER——大写转换 4、日期函数 CURRENT_DATE——…

为人工智能驱动的交通研究增强路面传感器数据采集

论文标题 英文标题:Enhancing Pavement Sensor Data Harvesting for AI-Driven Transportation Studies 中文标题:为人工智能驱动的交通研究增强路面传感器数据采集 作者信息 Manish Kumar Krishne Gowda Purdue University, 465 Northwestern Avenue,…

简讯:Rust 2024 edition and v1.85.0 已发布

详见 https://blog.rust-lang.org/2025/02/20/Rust-1.85.0.html 升级方法:rustup update stable

clickhouse-介绍、安装、数据类型、sql

1、介绍 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。 OLAP(On-Line A…

pycharm技巧--鼠标滚轮放大或缩小 Pycharm 字体大小

1、鼠标滚轮调整字体 设置 Ctrl 鼠标滚轮调整字体大小 备注: 第一个是活动窗口,即缩放当前窗口 第二个是所有编辑器窗口,即缩放所有窗口的字体 2、插件 汉化包: Chinese Simplified 包

R语言安装教程(附安装包)R语言4.3.2版本安装教程

文章目录 前言一、安装包下载二、R-4.3.2安装步骤三、rtools43安装步骤四、RStudio安装步骤 前言 本教程将详细、全面地为你介绍在 Windows 系统下安装 R 语言 4.3.2 的具体步骤。无论你是初涉数据领域的新手,还是希望更新知识体系的专业人士,只要按照本…

从零开始玩转TensorFlow:小明的机器学习故事 5

图像识别的挑战 1 故事引入:小明的“图像识别”大赛 小明从学校里听说了一个有趣的比赛:“美食图像识别”。参赛者需要训练计算机,看一张食物照片(例如披萨、苹果、汉堡等),就能猜出这是什么食物。听起来…

01 冲突域和广播域的划分

目录 1、冲突域和广播域的划分 1.1、冲突域 1.2、广播域 1.3、对比总结 1.4、冲突域与广播域个数计算例题 2、交换机和路由器的结构 2.1、交换机的结构 2.2、路由器的结构 1、冲突域和广播域的划分 1.1、冲突域 冲突域是指网络中可能发生数据帧冲突的物理范围。当多…

[C++]使用纯opencv部署yolov12目标检测onnx模型

yolov12官方框架:sunsmarterjie/yolov12 【算法介绍】 在C中使用纯OpenCV部署YOLOv12进行目标检测是一项具有挑战性的任务,因为YOLOv12通常是用PyTorch等深度学习框架实现的,而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff…

神经网络八股(3)

1.什么是梯度消失和梯度爆炸 梯度消失是指梯度在反向传播的过程中逐渐变小,最终趋近于零,这会导致靠前层的神经网络层权重参数更新缓慢,甚至不更新,学习不到有用的特征。 梯度爆炸是指梯度在方向传播过程中逐渐变大,…

zyNo.26

[GXYCTF2019]Ping Ping Ping(Web) 传/?ip1有ping回显,说明后端可能通过php参数接受了ip参数,并且拼接到了最终执行的命令里形成了ping -c 3$ip,这样可能存在一个命令注入漏洞 要判断是否符合 ping -c 3$ip …

轻量级SDK,大能量:EasyRTC重塑嵌入式设备音视频体验

在智能硬件与物联网迅猛发展的今天,嵌入式设备的音视频通讯能力正变得愈加关键。然而,受限于硬件资源,尤其是Flash存储空间的不足,传统的音视频通讯方案往往难以在嵌入式设备上实现高效集成。EasyRTC凭借其轻量级SDK和先进的技术架…

算法日常刷题笔记(2)

为保持刷题的习惯 计划一天刷3-5题 然后一周总计汇总一下 这是第二篇笔记 笔记时间为2月17日到2月23日 第一天 找到初始输入字符串 找到初始输入字符串 Ihttps://leetcode.cn/problems/find-the-original-typed-string-i/ Alice 正在她的电脑上输入一个字符串。但是她打字技…