.NET非/通用列表存储在堆栈或堆上?

时间:2014-03-27 12:06:18

标签: c# list generics

我想知道的是在堆栈或堆上存储以下列表的位置?

  1. 值类型的非通用列表

    int[] strArray = { 1, 2, 3 };
    
  2. 参考类型的非通用列表

    Person[] personArray = new Person[1];
    personArray[0] = new Person();
    
  3. 值类型的通用列表

    List<int> moreInts = new List<int>();
    moreInts.Add(10);
    
  4. 参考类型的通用列表

    List<Person> morePeople = new List<Person>();
    morePeople.Add(new Person ("Frank", "Black", 50));
    

2 个答案:

答案 0 :(得分:3)

  1. 字符串不是值类型
  2. 数组不是值类型
  3. 列表不是值类型(并在内部使用数组)
  4. 两者都可以理论上存储在堆栈或堆中(或完全不同的东西!),这不是规范的一部分。实际上,堆栈仅用于范围内的事物,并且为了简化确保引用在范围内,它通常只将值类型放在堆栈上,因为这些很容易验证。但是,它们也可以存储在寄存器中。由JIT编译器来决定。

    在不安全的代码中,您可以在堆栈上显式分配一些指针,但这只是在不安全的代码中。除此之外,它取决于JIT编译器的实现。但是,对于当前版本,您可以非常肯定所有无法验证的生命周期都足够有限,将被放置在堆上。这里的关键是范围,而不是它是引用类型还是值类型。只是价值类型通常很容易验证:)

    如果你必须考虑它是在堆还是堆栈上,它可能在堆上。在任何情况下,关键是&#34;你不在乎&#34;。只有在你有性能分析数据的情况下才会关心你确实遇到了与此相关的问题。

    记住 - 堆栈,堆,寄存器......所有这些只是.NET托管内存模型中的一个实现细节。

答案 1 :(得分:-1)

Everebody。所有数组都存储在堆中。 如果数组类型是struct,则存储在数组的单元格中的值。 列出数组中的安全值。

例如:

  1. strArray有3个单元格,其中3个指针指向堆
  2. 中的字符串
  3. personArray有1个单元格,其中1个指针指向堆
  4. 中的Person类
  5. moreInts有1个单元格,单元格中有1个整数值
  6. morePeople有1个单元格,指向堆
  7. 中的Person类