名词解释
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字节的区域就在堆区。
}