函数的变量存储在哪里? 堆栈或堆?
当一个程序调用一个函数时,哪种类型的数据结构是为该函数中的变量分配的内存? 堆或堆栈? 为什么?
在我看来,它应该存储在堆栈上,因为它们不一定是引用类型。 但是,在我读到答案的地方,它表明它们在堆中存储并在函数返回值后释放。
它比这更复杂一点,堆栈和堆的使用实际上是实现细节。 谈论数据的生命周期更有意义。 短期数据将存储在堆栈(或寄存器)中。 长期存活的数据存储在堆上。
引用类型的实例始终被认为是长期存在的,因此它们会堆积如山。 值类型可以是两个。 局部值类型通常存储在堆栈中,但如果某些东西将此类变量的生存期延长到超出函数范围之外,那么将其存储在堆栈中将没有任何意义。 这发生在捕获的变量上,即使它们是值类型,它们也会存储在堆中。
在调用函数之前将参数推入堆栈。 如果参数是值类型,则可以直接存储它们。 如果它们是引用类型,则将它们存储在堆中,并将指向内存位置的指针压入堆栈。 当函数返回时,这些值从堆栈弹出,最终垃圾收集器会注意到堆中的内存不再有指向它的指针,并且也会清除它。
你应该阅读这篇文章:http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx
在Eric Lippert的话中:
“在桌面CLR的C#的微软实现中,当值是一个本地变量或临时的,而不是一个lambda或anonymous方法的闭合局部变量的临时值时,值类型被存储在堆栈上,并且方法体不是一个迭代器块,抖动选择不注册该值。“
链接地址: http://www.djcxy.com/p/84359.html上一篇: Where variables of a function is store? on stack or heap?