进程的内存分配,四区和五区
四区和五区
C/C++把内存分为:栈区、堆区、全局区(静态区)、常量区、代码区
C/C++中的内存分为四个区域,分别是:
1. 栈区(Stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等。栈是一种先进后出的数据结构。
2. 堆区(Heap):由程序员手动分配和释放,当程序运行时,需要动态分配内存的数据就存在堆区。堆是一种无序的数据结构。
3. 全局区(静态区)(Static/Data):存放全局变量、静态变量、常量和字符串等,程序运行期间一直存在,程序结束后自动释放。
4. 代码区(Text):存放函数体的二进制代码。
此外,C++中还有一个新的区域,称为“五区”:
5. 常量区(Const):存放常量,包括全局常量和局部常量。常量区是和代码区分开的,常量区是只读的,不能修改。
c语言的四区只是将常量区和全局区合在一起称为数据区。
栈区
栈区主要存放局部变量、函数调用参数等栈区由编译器自动分配和释放栈属于 计算机系统的数据结构,进栈出栈有相应的计算机指令支持,而且分配专门的寄存器 存储栈的地址,效率分高,内存空间是连续的,但栈的内存空间有限。
先存高低值后存低地址,另外一提,数组的存储地址随下标增大而增大,因此如果在栈区定义一个变量之后定义数组可能会引起数组越界,这个情况不会报错因此会出现许多奇怪的错误。
堆区
使用malloc()/new()申请的内容存储在堆区
堆区由程序员手动分配,因此需要自己释放,如果不释放就会产生内存的泄漏
内存空 间几乎没有限制,内存空间不连续,因此会产生内存碎片。操作系统有一个记录空间 内存的链表,当收到内存申请时遍历链表,找到第一个空间大于申请空间的堆节点, 将该节点分配给程序,并将该节点从链表中删除。一般,系统会在该内存空间的首地 址处记录本次分配的内存大小,用于 delete 释放该内存空间。
使用完一定要释放空间,否则会内存溢出。
全局区
全局区分为两个段:
DATA段:存储初始化的全局变量、
初始化的静态变量BSS段:存储未初始化的全局变量、未初始化的静态变量其中BSS段会在程序执行前,
将内容全部置为0,所以未初始化的全局变量和未初始化的静态变量的值都为0
在许多编程语言中,全局变量的默认值是根据其数据类型而定的。以下是一些常见的默认值:
- 数字数据类型(整数、浮点数等):默认值为 0 或 0.0。
- 布尔数据类型:默认值为 false。
- 字符串数据类型:默认值为空字符串 ""。
- 数组和列表数据类型:默认值为一个空数组或空列表 []。
- 对象和类数据类型:默认值为 null 或 undefined,具体取决于编程语言的实现。
需要注意的是,在某些编程语言中,全局变量的默认值也可以被程序员指定或修改。
常量区
存放常量,而且不允许修改。
程序结束之后由系统释放。
里面存的数据只读不可改,如果是c++中const修饰的全局变量,可以用mutable击穿。
代码区
主要存放程序中的代码(二进制),属性是只读
进程的内存分配,四区和五区相关推荐
- mac下chrome浏览器的标签页、进程和内存分配
因为最近要解决网页经常崩溃的问题,所以去研究了一下chrome浏览器的标签页和进程的关系,以及标签页对应进程的内存分配. 标签页和进程的对应关系 当chrome浏览器开启但是没有任何一个标签页的时候, ...
- 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- 怀旧服一区和五区服务器位置,魔兽怀旧服战场分组怎么看?怀旧服战场分组一区五区怎么分的?...
魔兽怀旧服战场分组怎么看?怀旧服战场分组一区五区怎么分的? 2019-12-20 10:20 作者:我游网 来源:本站整理 浏览:5776 魔兽怀旧服战场分组怎么看?怀旧服战场分组一区五区怎么分的?最 ...
- linux c语言 glibc 错误 munmap,Linux内存分配小结--malloc、brk、mmap
Linux的虚拟内存管理有几个关键概念: 1.每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址: 2.虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟空间地址)与物理地址进行 ...
- 【Linux】内存分配小结--malloc、brk、mmap
原文:https://blog.csdn.net/gfgdsg/article/details/42709943 http://blog.163.com/xychenbaihu@yeah/blog/s ...
- linux内存管理策略,Glibc内存管理—ptmalloc内存分配策略(1)
一.linux的内存布局 1.32位模式下内存的经典布局 图1 32位模式下内存经典布局 注:这种内存布局模式是linux内核2.6.7以前的默认内存布局形式 说明:(1)在32的机器上,lo ...
- C语言第十三课,动态内存分配
动态内存分配的空间放在堆区.动态内存函数主要有:malloc,calloc,realloc 动态内存函数的介绍 malloc 申请一个空间,大小是size的大小,指向的一个类型不明,因为在设计的时候, ...
- brk函数 linux,brk和sbrk及内存分配函数相关-linux+内存
brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的: 每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空 ...
- Linux创建线程时 内存分配的那些事
文章目录 问题描述 问题分析 针对问题1 的猜测: 针对问题2 的猜测: 原理追踪 总结 问题描述 事情开始于一段内存问题,通过gperf工具抓取进程运行过程中的内存占用情况. 分析结果时发现一个有趣 ...
最新文章
- 没想到图像直方图有这么多应用场景
- LNOI2014 LCA
- 【风险管理】风控一二三
- 操作系统——CPU、计算机的构成
- mysql 使用正则表达式查询
- react复制内容到剪贴板
- Sales area data model research in QDD
- web框架之Django(一)
- 一篇关于Qt开发技巧的文章收藏
- 用idea建立jsp项目_用idea创建maven项目,配置tomcat详解
- 一些自成系统、完备的教程(链接、博客、github等)
- 1. 正则表达式简介
- 【Pix4d精品教程】Pix4d空三后处理:点云分类与过滤、DSM精编生成DEM、生成等高线案例详解
- 数据清洗 excel mysql_Excel获取MYSQL数据库数据
- 基于Tableau的疫情数据可视化看板
- BUUCTF_Misc题目题解记录
- 多文件批量下载打包成.zip
- 一、dubbo入门与实战
- 常用数据结构和算法总结
- 一梦江湖——华山快还钱是怎么会事呢?
热门文章
- Alvotech启动Stelara(R) (Ustekinumab)拟议生物仿制药AVT04的临床研究
- crm系统如何帮助企业提升客户满意度?
- 耦合、解耦是什么?怎么做到解耦呢?
- Linux离线升级redis-6.2.7
- Prometheus监控:rate与irate的区别
- 如何处理服务器网络连接不稳定?
- error LNK2001: 无法解析的外部符号 _sscanf 问题 解决方法
- 双电源8位I/O并行接口MRAM芯片MR256D08BMA45R
- 美国国内最大的招聘网站(转)
- 基于matlab的航迹发生器模拟,仿真输出经纬度、高度、俯仰、航向角等