内存的分区

news2025/1/23 11:30:16

目录

内存分区介绍

区域功能

内存分区运行前后的区别

运行之前(代码区+数据区+未初始化数据区)

运行之后(代码区+数据区+未初始化数据区+栈区+堆区)

缓冲区

缓冲区有什么用?

缓冲区的三种类型

缓冲区的刷新

内存分布图

栈与堆的区别

内存分区介绍

我们的内存一般分为四个区域提供使用

且每个区域存放的数据不同,使用效果也不同

它们分别是:堆区、栈区、全局区(静态区)、代码区

而对于一个程序的编译而言

编译程序占用的内存分为以下五个部分 :堆区、栈区、全局区(静态区)、文字常量区、代码区


区域功能

首先我们需要了解一下这几个区的功能:

  • 代码区:存放程序的编译后的可执行二进制代码,CPU执行的机器指令只读
  • 文字常量区:存放常量字符串只读
  • 全局区(静态区):存放全局变量,static修饰的全局、局部变量以及static修饰的函数,并且在这里面还分为data区和bss区可读可写
  • 栈区(heap):存放函数的参数值,局部变量的值等可读可写
  • 堆区(stack):允许程序在运行时动态地申请某个大小的内存空间,一般由程序员自己手动释放空间,或者程序结束时由OS(计算机系统)释放空间可读可写
int a = 0;   //存放在全局初始化区
char* p1;   //存放在全局未初始化区
int main()

{
	int b;//栈区
	char s[] = "abc";//栈区
	char* p2;//栈区
	char* p3 = "123456";//123456\0在常量区,p3在栈区。
	static int c = 0;//全局(静态)初始化区
	p1 = (char*)malloc(10);
	p2 = (char*)malloc(20);
	//分配得来得10和20字节的区域就在堆区。
	strcpy(p1, "123456");
	//123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

内存分区运行前后的区别

  • 运行之前(代码区+数据区+未初始化数据区)

程序运行之前,分为代码区数据区(data)未初始化数据区(bss)三个部分

对于代码区(text)而言,他存放了程序在编译时的二进制指令,是共享的,也就意味着所有程序在运行是都需要访问代码区来获取编译指令,也正因为如此,为了使代码区的指令不受改变,从而影响其他程序的编译,代码区是只读的

对于数据区(data)而言,这里存放的是已初始化的全局变量static修饰的全局、局部变量以及static修饰的函数

对于未初始化数据区(bss)而言,这里存放的是未初始化的全局变量static修饰的全局、局部变量以及static修饰的函数(初始化数据区的数据在程序开始执行之前被内核初始化为0或者NULL)

而数据区(data)和未初始化数据区(bss)一并存放在全局区(静态区)中 ~

QS:为什么要将程序的指令与程序的数据分开存放?

1.由于程序的指令是所有程序公用的,指令不能被随意修改,所以设为只读,且分开存放可以降低指令被修改的可能性

2.当系统中运行着多个同样的程序的时候,这些程序执行的指令都是一样的,所以只需要内存中保存一份程序的指令就可以了,只是每一个程序运行中数据不一样而已,这样可以节省大量的内存

  • 运行之后(代码区+数据区+未初始化数据区+栈区+堆区)

程序运行之后,分为代码区数据区(data)未初始化数据区(bss)栈区堆区

由于在程序运行之前,就已经分为了代码区,数据区(data)和未初始化数据区(bss),对于这三个区域而言它们的大小都是固定的程序运行期间不可改变

代码区:此时所有可执行代码段都加载到代码区(不可修改)

数据区:所有已初始化的全局变量static修饰的全局、局部变量static修饰的函数存放在此(不可修改)生命周期是直至程序结束

未初始化数据区:所有初始化的全局变量static修饰的全局、局部变量static修饰的函数存放在此(不可修改)生命周期是直至程序结束

栈区:存放函数的参数值、返回值、局部变量等,程序实时调用与释放(函数栈帧的创建与销毁)生命周期是调用期间到释放

堆区:用于动态内存管理分配(空间远大于栈)没有栈那样先进后出的要求顺序,生命周期是程序员分配到主动释放或者程序结束系统自动释放


缓冲区

缓冲区是内存的一块空间,这块空间用来缓冲输入或输出的数据

缓冲区有什么用?

举一个例子,我们从磁盘中读取1000000数据,若是计算机直接从中读取,这样就会造成两个问题

1.计算机也许无法一口气读取那么多的数据,需要多次读取

2.在读取期间计算机无法做其他事情

为了解决这两个问题,我们可以先将一定量的数据传输到缓冲区中,等到缓冲区存放满以后,再由计算机来读取,这样计算机不仅在数据传输到缓冲区的时候可以处理其他事情,在缓冲区存放完毕以后还可以一口气读取全部数据处理,这样就减少了读取次数,也提高了计算机工作效率

缓冲区的三种类型

1.全缓冲:在这种情况下,当填满标准I/O缓存后才进行实际I/O操作

(全缓冲的典型代表是对磁盘文件的读写

2.行缓冲:在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作

这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作

(行缓冲的典型代表是键盘输入数据

3.不带缓冲:为了使信息更快的显示出来不进行缓冲操作

  (不带缓冲的典型代表是标准出错情况stderr)

缓冲区的刷新

以下这三种情况会刷新清空缓冲区

1.缓冲区满时

2.执行flush语句

3.执行endl语句

4.关闭文件


内存分布图

如图所示:


 栈与堆的区别

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

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

相关文章

AI绘画——ControlNet扩展安装教程

目录 1.ControlNet安装 2.预处理模型安装 预处理模型(annotator)下载链接: 预处理模型安装地址: 3.ControlNet模型下载 Controlnet模型下载地址: Controlnet模型安装目录: 注:&…

KDZRS-40A三通道变压器直流电阻测试仪

一、产品概述 变压器绕组的直流电阻测试是变压器在交接、大修和改变分接开关后的试验项目。在通常情况下,用传统的方法(电桥法和压降法)测量变压器绕组以及大功率电感设备(发电机)的直流电阻是一项费时费工的工作。为了…

VMware从零配置安装CentOS 7

不跳步图文详细安装教程 一、VMware的下载二、VMware的安装三、CentOS7的下载第一步:根据自己电脑操作系统的位数点击选择(大多数都是64位操作系统)第二步:任意挑选一个镜像源进入下载界面第三步:下载对应版本的CentOS…

比较运算符、关键字子查询MySQL数据库 (头歌实践教学平台)

文章目的初衷是希望学习笔记分享给更多的伙伴,并无盈利目的,尊重版权,如有侵犯,请官方工作人员联系博主谢谢。 目录 第1关:带比较运算符的子查询 任务描述 相关知识 子查询 带比较运算符的子查询 编程要求 第2关…

Spring Messaging-远程命令执行漏洞(CVE-2018-1270)

Spring Messaging-远程命令执行漏洞(CVE-2018-1270) 0x00 前言 spring messaging为spring框架提供消息支持,其上层协议是STOMP,底层通信基于SockJS,在spring messaging中,其允许客户端订阅消息&#xff0…

微服务 - Redis缓存 · 数据结构 · 持久化 · 分布式 · 高并发

一、分布式解决 Session 的问题 在单站点中,可以将在线用户信息存储在Session中,随时变更获取信息;在多站点分布式集群如何做到Session共享呢?架设一个Session服务,供多服务使用。 频繁使用的数据存在DB端&#xff0…

向隐形冠军学习:聚焦人效,用时间管理提效益

注: 本文来源于盖雅工场联合创始人兼CEO 章新波 在2023狮山论坛“ 向隐形冠军学习: 聚焦人效,用时间管理提效益 ”的主题分享。 文|章新波 整理 |盖雅学苑 在人力资源行业以及各大企业,「人效」这个词…

How to use CCS to debug a running M4F core that was started by Linux?

参考FAQ:AM62x & AM64x: How to use CCS to debug a running M4F core that was started by Linux? 问题记录: 1.使用SD卡启动模式,板上运行Linux。 当Linux系统启动后,9表示M4F core: am64xx-evm login: root rootam64xx…

Maven 打包跳过测试的 5 种方法

平时开发时的工作的话之主要负责写代码就行了,什么发布项目啊,好吧不是我们干的事。在我们的了解中打包发布项目应该不是一个困难的问题。 对,最简单的方法就行使用直接使用maven插件打包,甚至我们都不需要知道他是怎么实现的&am…

搞懂 API :Mock 常见问题及解决办法

API Mock是一个构建Web服务质量保证环节的非常实用的工具。它可以让开发者在独立工作或集成测试时,快速开始调试和验证他们的代码。但是,在实践中,API Mock也可能会出现一些问题。 本文将讨论API Mock中的一些常见问题,并提供一些…

MyBatis(十四)MyBatis的缓存

前言 1、缓存:cache 2、缓存的作用: 通过减少IO(读写)的方式,来提高程序的执行效率。 3、mybatis的缓存: 将select语句的查询结果放到缓存(内存)当中,下一次还是这条…

Python爬虫之Js逆向案例(1)-京东商品评论数据商品详情数据案例

<center>声明&#xff1a;京东商品评论数据&商品详情获取分析仅用于研究和学习&#xff0c;如有侵权&#xff0c;可删除</center> 一次运行程序&#xff0c;同时获取一下内容&#xff1a; 1. 获取整站实时商品详情数据&#xff1b; 2. 获取整站实时商品评论数…

【数据结构】顺序表的增删查改操作

上一篇文章为大家介绍了对顺序表的简单的使用&#xff0c;【数据结构】顺序表详解_王笃笃的博客-CSDN博客 本篇文章继续完善对顺序表增删查改的操作。 上一篇写到了顺序表的尾部插入&#xff0c;本篇将从头部插入继续完善&#xff1b; 以下为本篇目录&#xff0c;方便阅读 …

Axios请求(对于ajax的二次封装)——Axios拦截器与错误处理

Axios请求&#xff08;对于ajax的二次封装&#xff09;——Axios拦截器与错误处理 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现核心干货axios拦截器在请求或响应被处理之前拦截他们移除拦截器给自定义的axios实例添加拦截器实际开发中的自定义拦截器&am…

C++ | 探究拷贝对象时的一些编译器优化

&#x1f451;作者主页&#xff1a;烽起黎明 &#x1f3e0;学习社区&#xff1a;烈火神盾 &#x1f517;专栏链接&#xff1a;C 文章目录 前言一、传值传参二、传引用传参三、传值返回拷贝构造和赋值重载的辨析 四、传引用返回【❌】五、传匿名对象返回六、总计与提炼 前言 在传…

网友感到担忧!iOS 17支持第三方应用商店:这下跟安卓没区别了

苹果此前官宣将于6月6日召开WWDC2023大会&#xff0c;按照往年的惯例&#xff0c;在这次大会上将会推出下一代iOS系统&#xff0c;也就是iOS 17。最近国外有关iOS 17的爆料中提到&#xff0c;迫于欧盟法案压力&#xff0c;iOS 17或将支持第三方应用商店。 2022年3月份&#xff…

springboot+vue社区维修平台(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的社区维修平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 目前有各类成品java毕设&#xff0c;需要请看文末联…

Chapter11-最常用的消费类

11.1 整体流程 我们使用 DefaultMQPushConsumer 的时候&#xff0c;一般流程是设置好 GroupName 、NameServer 地址 &#xff0c;以及订阅的 Topic 名称&#xff0c; 然后填充Message 处理函数&#xff0c;最后调用 start &#xff08;&#xff09; 。 11.1.1 上层接口类 Defau…

Qt Quick - SplitView

Qt Quick - SplitView使用总结 一、概述二、属性介绍三、简单使用四、序列化SplitView的状态五、定制化 一、概述 SplitView是一个水平或垂直布局元素的控件&#xff0c;每个元素之间有一个可拖动的分配页面内容的滑块。很像IDE里面的那些窗口。就像下面的简单的布局内容一样。…

调度系统: Quartz

最近在做数据中台架构设计&#xff0c;整体架构设计完后发现数据中台最重要的就是元数据和调度系统。元数据设计参考了atlas、metcat、datahus&#xff0c;模型设计、数据架构、技术架构基本完成。现在设计调度系统&#xff0c;才发现调度系统不像别的系统&#xff0c;主要是理…