Memory 为什么内存分配需要堆栈和堆

Memory 为什么内存分配需要堆栈和堆,memory,dynamic,stack,heap,Memory,Dynamic,Stack,Heap,我已经搜索了一段时间,但是对于为什么必须在堆栈上分配值类型,而引用类型(即动态内存或对象)必须驻留在堆上,还没有得出结论性的答案。 为什么不能在堆栈上分配相同的变量?在堆栈中分配局部变量。如果不是这样,在分配变量的内存时,就不能让变量指向堆。如果需要,您可以在堆栈中分配东西,只需在本地创建一个足够大的缓冲区,然后自己管理它。可以。实际上,这并不是因为堆栈通常比堆少,在堆栈上分配引用类型可能会很快耗尽它。此外,如果函数返回在其堆栈上分配的数据,则需要复制调用方的语义,否则返回的内容将被下一个函数调

我已经搜索了一段时间,但是对于为什么必须在堆栈上分配值类型,而引用类型(即动态内存或对象)必须驻留在堆上,还没有得出结论性的答案。
为什么不能在堆栈上分配相同的变量?

在堆栈中分配局部变量。如果不是这样,在分配变量的内存时,就不能让变量指向堆。如果需要,您可以在堆栈中分配东西,只需在本地创建一个足够大的缓冲区,然后自己管理它。

可以。实际上,这并不是因为堆栈通常比堆少,在堆栈上分配引用类型可能会很快耗尽它。此外,如果函数返回在其堆栈上分配的数据,则需要复制调用方的语义,否则返回的内容将被下一个函数调用覆盖


值类型,通常是局部变量,可以使用本机指令快速轻松地引入和退出范围。返回时值类型的复制语义很简单,因为它最适合机器寄存器。这种情况经常发生,应该尽可能便宜。

值类型总是存在于堆栈上是不正确的。阅读Jon Skeet关于该主题的文章:

我知道堆栈范例(嵌套分配/释放)无法处理某些需要非嵌套对象生存期的算法

正如静态分配范式不能处理递归过程调用一样。(例如,将斐波那契(n)简单计算为f(n-1)+f(n-2))


不过,我不知道有什么简单的算法可以说明这一事实。任何建议都将不胜感激:-)

当方法退出时,方法放在堆栈上的任何内容都将消失。在.net和Java中,如果一个类对象在最后一个对它的引用消失时就消失了,这是完全可以接受的(事实上是可取的),但如果一个对象在引用仍然存在时消失了,这将是致命的。在一般情况下,当方法创建对象时,编译器不可能知道该对象的任何引用在方法退出后是否会继续存在。如果没有这样的保证,分配类对象的唯一安全方法就是将它们存储在堆上


顺便说一句,在.net中,可变值类型的一个主要优点是它们可以通过引用传递,而不必放弃对它们的永久控制。如果类“foo”或其方法具有一个结构“boz”,其中一个foo方法通过引用方法“bar”传递该结构,则bar或其调用的方法在返回之前可以执行任何他们想执行的操作“boz”,但一旦“bar”返回对“boz”的任何引用,它就会消失。与用于类对象的杂乱共享引用相比,这通常会带来更安全、更清晰的语义。

因此,基本上您正在堆栈上创建一个自定义托管堆。;)