Table of Contents
#custom-toc-container
内存的各个区
# 内存分区 `内存单元`可以分为`系统区`(操作系统使用)和`用户区`(用户程序使用)两部分。
分类
说明
内存
系统区
操作系统使用
用户区
用户程序使用
**用户区**:分为==代码区==(code area、程序代码区,存放程序的二进制代码)和==数据区==(存放程序数据)。
分类
说明
用户区
代码区
code area、程序代码区,存放程序的二进制代码
数据区
存放程序数据
**数据区**:分为==静态数据区==(静态区,有最长生存期)和==动态数据区==(动态区,有较短生存期)。
分类
说明
数据区
静态数据区
也称“静态存储区”,分为全局数据区和文字常量区;程序运行前就分配好了,静态存储区中的数据在程序运行期间一直存在,直到程序结束才被释放
动态数据区
也称“动态存储区”,分为堆区(heap area、堆空间)和栈区(stack area、栈空间);程序运行起来之后才会使用
```mermaid graph LR A[内存]-->B1[系统区] A-->B2[用户区] B2-->C1[代码区] B2-->C2[数据区] style C3 stroke-dasharray:10,5 style C4 stroke-dasharray:10,5 B2-->C3[共享地址空间] B2-->C4[进程控制块] C2-->D1[静态数据区] C2-->D2[动态数据区] D1-->E1[全局数据区] D1-->E2[文字常量区] D2-->E3[堆区] D2-->E4[栈区] ``` # 内存各个区的作用 >`程序代码区`(code area):存储程序的执行代码(二进制代码),包括函数、指令和程序逻辑。两个特点: >只读:不能被修改,使其只读的原因是防止程序意外地修改了代码区的指令。 >共享:目的是对于频繁执行的程序,只需要在内存中有一份代码即可。 `全局数据区`(data area):存放的是==全局变量==和==静态变量==(常指局部静态变量,包括全局静态变量和局部静态变量)。 初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在(有时初始化区和未初始化区不一定相邻)另一块区域,将初始化为0(字符与字符串初始化并不不相同)。在编译时分配,结束时由系统释放。 >`文字常量区`(位于静态数据区):用于存储常量(常变量、字面量)数据。字面量,例如字符串常量。这个区域的数据在程序运行期间不可修改。 程序结束后由系统释放。 `栈区`(stack area):存放的是==局部变量==、==const修饰的局部变量(局部常变量)==、==函数参数==、==调用函数的状态==、==返回地址==等。 自高地址向低地址扩展或自低地址向高地址扩展(不同芯片不一样)。由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈(只有一个方向能插入与删除,即栈顶)。 栈区是一块内存区域,用于存储函数调用和局部变量。它具有后进先出(Last In, First Out)的特性,因此最后进入栈区的数据首先被移出。栈区的大小通常是固定的,栈区上的内存管理是由编译器自动处理的。 >`堆区`(heap area) >程序员自动申请的内存(==动态申请的内存==)被分配到堆空间,由程序员自己释放, 若程序员不释放,程序结束时可能由操作系统回收 。 >堆是==动态分配==的内存区域,用于存储动态创建的数据,例如通过new和malloc函数分配的对象。堆的大小可以根据需要在运行时进行调整,但需要手动释放分配的内存,以避免内存泄漏。 # 参考文献 https://blog.csdn.net/hrlnldy/article/details/8018076 http://yncoders.com/show/4727
文章目录
内存
会分配新内存的操作
节省内存的操作