1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。

    其操作方式类似于数据结构中的栈。

2、堆区(heap) — 在内存开辟另一块存储区域。

  一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
  如:c中malloc和c++中new
  注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、全局区(静态区)(static)—编译器编译时即分配内存。

   全局变量和静态变量的存储是放在一块的,
   
   初始化的全局变量和静态变量在一块区域,
   
    未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 
    
   - 程序结束后由系统释放

4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放。

5、程序代码区—存放函数体的二进制代码。

注:每个线程都会有自己的栈,但是堆空间是共用的。

栈堆效率比较

栈是机器系统提供的数据结构,计算机会在底层堆栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。

堆则是c/c++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆得效率比栈要低得多。