C/C++内存布局

2023-11-05

  下图是c/c++的进程的内存分布布局图,搞清楚内存布局对于理解一个程序是非常重要的。

   一个程序运行起来,操作系统会给每个进程分配一个 4G 的程序地址空间,当然这都是虚拟地址空间,因为如果一个进程分 4G 的内存,那么就算有再多的内存也不够分。
   这些虚拟地址空间中的内存分段都是什么意思呢?下面进行讲解:
在这里插入图片描述
一、首先进程地址空间的 1G 内核空间是给操作系统使用的,我们用户是没有操作权限的。
二、剩下的 3G 内存空间中,分为了栈区、内存映射段、堆区、数据段、bss段、代码段
1)栈区:这里的栈和数据结构的栈并不相同,数据结构的栈是一种后进先出的数据结构,而内存划分的栈是操作系统按照栈的特性,给用户划分出的内存区间。
   栈区一般存放:函数体的局部变量、函数调用期间的所有参数压栈、函数的返回值
注意栈区这段内存是由操作系统自己维护的,所以函数结束,在栈上的空间会由操作系统自己回收。

2)堆区:用户所操作的内存就是堆上的空间,用户可以使用 malloc / calloc / realloc / new 申请堆上的空间,但是用户申请堆上的空间必须自己手动释放,不然会造成内存泄漏。

3)内存映射段:里面存放 动态库 / 静态库,以及文件映射,匿名映射等等一切有依赖性的东西都在这段区域

4)一个程序本质上都是由 bss段、数据段、代码段组成的
   数据段:存放全局变量、静态类型的变量。当代码编译完后,在可执行程序这个文件中已经把这些数据的空间划分好了,这种类型的数据,在程序运行以前,操作系统就将数据段中的数据加载到内存了。也就是说在进入 main 函数之前这些数据已经划分号空间了。

   bss段:其实在 C 语言中,数据段中还有一个 bss 段,这里面存放的是未初始化的全局变量和静态数据,而数据段中存放的是已经初始化过的全局变量和静态数据。数据段中的所有数据已经划分好空间了,但是 bss 段并没有给其中的数据划分空间。

   代码段:存放可执行代码,以及只读常量(字符串常量等等)。这段内存是只读的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++内存布局 的相关文章

随机推荐

  • 蛇形/回形矩阵(超详细!看了不会你来打我)

    回型矩阵 给你一个整数n 按要求输出n n的回型矩阵 例如输入n 4 输出如下 分析 回形矩阵的填充轨迹如下所示 填充顺序 最上面的行 gt 最右边的列 gt 最下面的行 gt 最左边的列 gt 最上面的行 gt 首先 我们可以看出 填充轨
  • 使用SQL语句查询经纬度之间的距离和一定范围内的数据

    declare a decimal 18 7 经度 declare b decimal 18 7 维度 set a 119 921001 set b 35 943285 declare c decimal 18 7 set c 6371 地
  • JavaScript判断对象是否为空对象的几种方法

    目录 1 空对象对应的字符串为 2 for in 3 jquery 的 isEmptyObject 方法 4 Object getOwnPropertyNames 5 ES6 的 Object keys 6 JSON stringify 扩
  • 服务计算--简单 web 服务与客户端开发实战

    一 概述 利用 web 客户端调用远端服务是服务开发本实验的重要内容 其中 要点建立 API First 的开发理念 实现前后端分离 使得团队协作变得更有效率 任务目标 选择合适的 API 风格 实现从接口或资源 领域 建模 到 API 设
  • C++ 字符串

    C 提供了以下两种类型的字符串表示形式 C 风格字符串 C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言 并在 C 中继续得到支持 字符串实际上是使用 null 字符 终止的一维字符数组 因此 一个以 nu
  • 错误处理-mmdetection-AttributeError: ‘ConfigDict‘ object has no attribute ‘log_level‘

    第一次用商汤的mmdetection 遇到很多错误 mmdetection中网络的配置文件缺东西 至少缺了log level参数的值 此文章将继续更新我在使用过程中的问题与解决办法 敬请期待 祝你学习愉快 1 2 3 4 5 6 7 8 9
  • 数据库常用的四种方法

    排序查询 select 列表属性 列表属性 from 列表名order by 列表属性 列表属性 删除 delete from 列表名 where 列表属性 值 插入 insert into 列表名 values 值 值 值 值 inser
  • 数学知识整理:二重积分

    1 二重积分的性质 1 1 f x y 在有界闭区域上可积的充分条件 必要条件 在有界闭区域D上可积的函数f x y 必然是D上的有界函数 有界闭区域D上的连续函数或者分片连续函数f x y 在D上可积 1 2 线性性质 1 3 积分区域可
  • TCP/IP详解 卷1:协议 学习笔记 第十章 动态选路协议

    静态选路包括在配置接口时 以默认方式生成路由表项 对于直连路由 直连路由是由链路层协议发现的 一般指去往路由器的接口地址所在网段的路径 通过route命令增加表项 通常通过系统自引导程序文件 或通过ICMP重定向生成路由表项 通常在默认方式
  • 代理简介

    1 正向代理 正向代理类似一个跳板机 代理访问外部资源 比如我是一个用户 我访问不了某网站 但是我能访问一个代理服务器 这个代理服务器呢 他能访问那个我不能访问的网站 于是我先连上代理服务器 告诉他我需要那个无法访问网站的内容 代理服务器去
  • eclipse开发burpsuite插件

    安装相关软件 eclipse jee 2019 06 R win32 x86 64 zip burpsuite community edition v1 7 32 burpsuite 插件helloworld demo 下载链接在文章末尾
  • PyQt5之信号与信号槽

    一 信号与信号槽特点 PyQt的窗口控件类中有很多内置信号 开发者也可以添加自定义信号 信号与槽具有如下特点 一个信号可以连接多个槽 一个信号可以连接另一个信号 信号参数可以是任何Python类型 一个槽可以监听多个信号 信号与槽的连接方式
  • 定时删除centos服务器日志

    现在java程序的日志一般是使用log4j slf4j 来打日志 并且一般都喜欢用DailyRollingFileAppender模式 就是每天产生一个日志 还有一种是 RollingFileAppender模式 这个模式是按文件大小来保存
  • QT 实现五子棋

    1 程序简介 五子棋是一款大家都熟系的小游戏 这里给大家一步一步的详细介绍如何用QT开发这个游戏 并通过这款游戏的开发练习 进一步熟系 qvector qpoint qpainter QMouseEvent 产生工具栏等的用法和方法 2 程
  • 小学生报编程机器人有什么益处

    小学生报编程机器人有什么益处 小孩子的学习一直都是很多家长们非常关心和重视的一件事情 很多的家长在培养孩子的学习方面也可以说是相当的耐心的 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对于孩子学习机器人编程的好处并不是很清
  • 信号集(未决信号集,阻塞信号集)

    未决信号集和阻塞信号集的关系 阻塞信号集是当前进程要阻塞的信号的集合 未决信号集是当前进程中还处于未决状态的信号的集合 这两个集合存储在内核的PCB中 下面以SIGINT为例说明信号未决信号集和阻塞信号集的关系 当进程收到一个SIGINT信
  • 《从零开始编写一个直播服务器》 C++ 实现一个最简单的RTSP流媒体服务器

    流媒体开发系列文章 文章目录 流媒体开发系列文章 前言 一 rtsp流是什么 二 使用步骤 1 服务器代码 总结 前言 在安防行业中 onvif协议与gb协议是两种标准 gb是国内安防行业的标准 onvif是国外的安防行业的标准 其中gb2
  • 【华为OD机试】数字游戏【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 小明玩一个游戏 系统发1 n张牌 每张牌上有一个整数 第一张给小明 后n张按照发牌顺序排成连续的一行 需要小明判断 后n张牌中 是否存在连续的若干张牌 其和可以整除小
  • Heroku 部署有关 opencv 的 Django 后端应用(pdf2docx)

    文章目录 场景 解决方案 Aptfile Buildpacks Dashboard 上手动构建 Heroku CLI 终端构建 Requirements txt 提交改变 场景 我使用 heroku 部署了一个 Django 后端项目 里面
  • C/C++内存布局

    下图是c c 的进程的内存分布布局图 搞清楚内存布局对于理解一个程序是非常重要的 一个程序运行起来 操作系统会给每个进程分配一个 4G 的程序地址空间 当然这都是虚拟地址空间 因为如果一个进程分 4G 的内存 那么就算有再多的内存也不够分