数组内存分配澄清

本文关键字:分配 内存 数组 | 更新日期: 2023-09-27 18:11:52

今天我正在阅读一个关于数组及其内存分配的SO线程。我找到了一个答案,它解释得很清楚,我必须说它很好。

但是在读完那个答案之后,我有了更多的问题,我一直在问自己关于我刚刚读到的东西。到目前为止,我还不能回答自己也不能谷歌它。因此,我需要你的帮助来解释这些问题给我。

  1. 为什么数组被创建在堆上,而它的每一个内容都是被存储在堆栈中?只是2在值类型的情况下避免装箱?
  2. 如果上面是真的,那么为什么数组必须首先在堆上创建2 ?

  3. 当他在他的回答中说,新的int[100]实际上是在堆上创建的,是400(100 * 4)字节在堆上分配?如果是,为什么?因为所有的值都被存储在堆栈

  4. 如果创建了1000个项目数组,那么究竟如何存储堆栈?我知道1mb是分配的堆栈大小。但在这种情况下,它将超过。那到底是什么?

如果需要,请随时添加您自己的问题或更多信息。

谢谢

数组内存分配澄清

当我们说数组在堆上分配时,它意味着值将在堆中。数组值不存储在堆栈中。我认为这回答了所有三个问题。

var myArray = new int[10];

上面的行在堆栈上创建myArray 变量,但是数组的内存是在堆上分配的,因此存储在其中的所有值也会在堆中。

据我所知,在非正式定义中,值类型存储在定义它们的本地。因此,如果在方法中定义了单个值类型,它将存储在堆栈中。如果它被定义为类中的字段,或者在本例中,作为数组中的项,那么'父'对象就在堆上,因此值类型也将存储在堆上。

有关值类型与引用类型和堆栈的更多详细信息,请参阅Eric Lippert的文章:

  • 栈是一个实现细节,第一部分
  • 栈是一个实现细节,第二部分