有多个“栈”的概念。程序运行中的内存栈,与数据结构的栈,是两个不同的东西,字相同,意义不同。程序的内存栈,只是快速存取数据的一块空间,程序对这块内存的数据,写上去是不看原先内容的,闭上眼就覆盖,而且空间会反复利用,这种数据未必总是后进先出(不是参数压栈那种数据结构栈模式),总之,你把这种空间看作是数据容易被擦写的就行了。当一段函数被执行,或为某段代码块运行,而开辟了栈空间,局部变量就占用这块内存,当代码块或函数结束,程序就宣布这块中的数据被废弃,可以回收利用,此时不需清零和释放内存,后面的函数和代码块数据分配见有空闲而足够的内存就会来占据,把原先的数据擦掉就行了(想象一下新数据擦不满旧数据会留下旧数据的情形就知道会出现什么情况,很多现象都是这个原因解释的)。相反,对堆数据来说,那些数据不明令释放和废弃,程序是不会擦写它们的。这样两种不同的处理手法,就是栈内存和堆内存的区别,其实是从一条内存线上的两端相向增长使用内存罢了。
C/C++本机程序,划分栈内存和堆内存,但托管的C++/CLI程序,是只有栈内存的,程序不负责回收内存,也不需释放,只要往整个程序空间(32位机上是4G内存)不断向前取空间就是了,不需回收,不需管理,所以效率比传统的做法高得多,因为全部是栈内存模式,是最高效的用法,一般来说,中小型程序,几乎都不用垃圾回收机制回收内存(托管程序是没有释放动态申请内存的指令的,亦即不需free()或delete内存,省事许多),程序结束后由操作系统把整个空间回收,干干净净。
程序中,把那么一块内存叫做“栈空间”,数据结构把某种数据的处理手法叫“栈存取模式”。