进程之间内存空间独立,不可互相访问。
每个进程可以有多个线程,线程之间共享内存空间。但是,每个线程有自己独立的栈空间,栈空间分为:用户栈、内核栈。
栈(stack):
1、由编译器自动分配与释放,存放函数的参数、局部变量等。
2、存取方式:后进先出。
3、使用:栈空间使用完时,系统会抛出栈异出的异常。
4、申请效率:分配较快,自动分配回收。
堆(heap):
1、通过malloc()动态申请,需要通过编程申请与释放。如果编程未释放,在进程结束时,可能由OS自动回收(取决于不同OS的实现)。
2、存取方式:申请与释放顺序没有约定,比较随机。
3、使用:堆空间用完时,内存申请会返回失败。
4、申请效率:从系统全局空闲内存中分配,速度比较慢,并且容易产生内存碎片。
存取效率:
以下述代码为例分析:
void main()
{
char a = 1;
char b[] = "1234567890";
char *c ="1234567890";
a = b[1];
a = c[1];
return;
}
效率分析:
a=b[1],直接把字符串中的元素读到寄存器中。
a=c[1],要先读取指针的值,在读取指针指向内存的值,显然比较慢。