内存的几大区域

持续更新中...

Posted by CoderLeonidas on September 21, 2017

名词解释

RAM:运行内存,不能掉电存储。

ROM:存储空间,可以掉电存储,例如内存卡、Flash。

内存的几大区域分布图

代码区

存放:函数的二进制代码

常量区

存放:常量字符串

释放时机:程序结束后由系统释放。

全局区(数据段)

细分:未初始化全局区bss段和初始化全局区data段

存放:初始化的全局变量和静态变量,存放在data段;未初始化的全局变量和静态变量,存放在bss段

释放时机:程序结束后由系统释放。

举例: int a;未初始化的 int a = 10 ;已初始化的。

堆空间

存放:由程序员分配的内存

释放时机:程序员释放或者程序结束时,操作系统回收

由程序员分配和释放,如果程序员不释放,可能会出现内存泄露,程序结束的时候,可能会由操作系统回收,比如iOS中alloc都是存放在堆中,优点是灵活方便,数据适应面广泛,但是效率有一定降低,堆空间的分配总是动态的,不同堆分配的内存无法互相操作。虽然程序结束的时候所有的数据空间都会被释放回系统,但是精确的申请内存,释放内存匹配是良好程序的基本要素。主要存放用new构造的对象和数组。

栈空间

存放: 函数的参数值,局部变量等,方法调用的实参

释放时机: 编译器自动分配释放。

由编译器自动分配并释放,存放的是函数的参数值,局部变量等,方法调用的实参也是保存在栈区的。栈是系统数据结构,对应线程/进程是唯一的。优点是快速高效,缺点是有限制,数据不灵活。主要存放一些基本类型的变量和对象引用类型。

动态库

代码举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int a = 10; // 全局初始化区
char *p; //    全局未初始化区
 
main{
   int b; // 栈区
   char s[] = "abc" // 栈区
   char *p1; //    栈区
   char *p2 = "123456" 123456 在常量区,p2在栈上
   static int c = 0; // 全局(静态)初始化区
    
   w1 = (char *)malloc(10);
   w2 = (char *)malloc(20);
   分配得来的10和20字节的区域就在堆区。
}

简单理解下内存的几大区域