. net非/泛型列表存储在堆栈或堆中

本文关键字:堆栈 存储 泛型 列表 net | 更新日期: 2023-09-27 17:54:13

我想知道的是在哪里存储以下列表,在堆栈上还是在堆上?

  1. 值类型的非泛型列表

    int[] strArray = { 1, 2, 3 };
    
  2. ref类型

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

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

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

. net非/泛型列表存储在堆栈或堆中

  1. 字符串不是值类型
  2. 数组不是值类型
  3. List不是值类型(并且在内部使用Array)

理论上都可以存储在堆栈或堆上(或者完全不同的地方!),这不是规范的一部分。在实践中,堆栈只用于作用域内的事情,为了简化确保引用在作用域内的过程,它通常只将值类型放在堆栈上,因为这些很容易验证。但是,它们也可以存储在寄存器中。这要由JIT编译器来决定。

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

如果你必须考虑它是在堆上还是在堆栈上,它可能在堆上。无论如何,关键是"你不在乎"。只关心是否有性能分析数据来支持您确实存在与此相关的问题的事实。

记住-堆栈,堆,寄存器…

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

例如:

  1. strArray有3个单元格,有3个指针指向堆中的字符串
  2. personArray有一个单元格和一个指向堆中的Person类的指针
  3. moreintts在单元格
  4. 中有1个单元格和1个整数值
  5. morePeople在堆中有一个指向Person类的单元格