一、栈和堆:
栈steak(数据结构):一种后进先出的的数据结构
栈(操作系统):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
堆heap(数据结构):堆可以被看成是一棵树,如:堆排序
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。
堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
简单的来讲,栈上分配的内存系统自动释放,堆上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里。
栈一般是静态分配内存,堆一般是动态分配内存。
二、静态分配、自动分配、动态分配:
(1)静态分配(栈)
从静态存储区域分配内存。程序编译的时候内存已经分配好了,并且在程序的整个运行期间都存在,如静态变量和全局变量。
把房间看做一个程序,我们可以把静态分配的内存当成是房间里的耐用家具。通常,它们无需释放和回收,因为没人会天天把大衣柜当作垃圾扔到窗外。
(2)自动分配(栈)
在栈中为局部变量分配内存的方法,栈中的内存可以随着代码块退出时的出栈操作被自动释放。例如在执行函数时,函数内局部变量的存储单元可以在栈上创建,函数结束时这些存储单元自动被释放。
这类似于到房间中办事的人,事情一旦完成,就会自己离开,而他们所占用的空间,也随着这些人的离开而自动释放了。
(3)动态分配(堆)
在堆中动态分配内存空间以存储数据的方式。也就是程序运行时用malloc或new申请的内存,我们需要自己用free或delete释放。
堆中的内存块好像我们喝过的空瓶等,用过了就得扔到垃圾箱里,否则屋内就会满地狼藉。