栈:编译器需要的时候分配,需要的时候压栈,返回的时候弹栈。存储的变量一般是:局部变量,函数参数。
堆:就是new分配的内存块,内存块的释放编译器不管,需要人工去控制,一般一个new就要对应一个delete。需要手动申请和释放
自由存储区:使用malloc申请的内存块,和堆相似,使用free释放
全局/静态存储区:全局变量和静态变量被分配到一块内存中。
常量存储区:比较特殊的存储区,存放常量。不允许修改。(当然非正当修改,方法有很多)
堆和栈的区别:
- 管理方式不同(栈:编译器自动管理。堆:需要人工管理,如果不释放,就会产生内存泄漏)
- 空间大小不同(32位系统下,堆内存可以达到4G空间,从这个角度来看堆内存没什么限制。栈:有一定的存储空间,较小,只有几M)
- 能否产生碎片不同 (堆会产生,栈不会)
- 生长方向不同 (堆,向内存地址增加的方向,栈,向着内存地址减小的方向增长)
- 分配方式不同(堆都是动态分配的。栈:静态分配局部变量,静态分配:alloca)
- 分配效率不同(栈的效率高,因为栈是系统内部提供的数据结构,有专门的寄存器,而堆是C/C++,分装好的算法,申请空间时,效率没有栈高)