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