1.栈区(stack)
栈区:由编译器⾃动分配并释放,存放函数的参数值,局部变量等。栈是系统数据结构,对应线程/进程是唯⼀的。
申请大小:栈是向低地址扩展的数据结构,是⼀块连续的内存的区域。是栈顶的地址和栈的
最⼤容量是系统预先规定好的,栈的⼤⼩是2M(也有的说是1M,总之是⼀个编译时
就确定的常数) ,如果申请的空间超过栈的剩余空间时,将提示溢出,能从栈获得的空间较⼩。
系统响应方法:存储每⼀个函数在执⾏的时候都会向操作系统索要资源,栈区就是函数运⾏时的内存,栈区中的变量由编译器负责分配和释放,内存随着函数的运⾏分配,随着函数
的结束⽽释放,由系统⾃动完成。
注意:只要栈的剩余空间⼤于所申请空间,系统将为程序提供内存,否则将报异常提
示栈溢出。
优点:快速⾼效,不会产生碎片
缺点:有限制,数据不灵活。(先进后出)
2.堆区(heap)
堆区: 由程序员分配和释放,用new/alloc方法创建的对象,手动申请空间,如果程序员不释放,程序结束时,可能会由操作系统回收 。
系统响应方法:
- ⾸先应该知道操作系统有⼀个记录空闲内存地址的链表。
- 当系统收到程序的申请时,会遍历该链表,寻找第⼀个空间⼤于所申请空间的堆
结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。 -
由于找到的堆结点的⼤⼩不⼀定正好等于申请的⼤⼩,系统会⾃动的将多余的那
缺点:效率有⼀定降低,容易产生碎片。
部分重新放⼊空闲链表中
申请大小:堆是向⾼地址扩展的数据结构,是不连续的内存区域。这是由于系统是⽤链表来
存储的空闲内存地址的,⾃然是不连续的,⽽链表的遍历⽅向是由低地址向⾼地址。堆的⼤⼩受限于计算机系统中有效的虚拟内存。由此可⻅,堆获得的空间⽐较灵活,也⽐较⼤。
优点:灵活⽅便,数据适应⾯⼴泛
3.全局区(静态区) (static)
全局区(静态区):全局变量和静态变量的存储是放在⼀起的,初始化的全局变量和静
态变量存放在⼀块区域,未初始化的全局变量和静态变量在相邻的另⼀块区域,程序结束后
4.常量去/数据段
用来存储已经初始化的全局变量,静态变量,常量数据,程序结束后由系统释放
5.代码段
存放函数的⼆进制代码(用来存储程序的代码/指令)
//全局初始化区
int a = 10;
//全局未初始化区
char *p;
main {
//栈区
int b;
//栈
char s[] = "abc";
//栈
char *p1;
//常量区
char *p2 = "1234";
//全局(静态)初始化区
static int c = 0;
//分配来的10和20字节的区域在堆区
m = (char *)malloc(10);
n = (char *)malloc(20);
}
网友评论