C#等价的C++向量,具有连续的内存?

cMi*_*nor 76 c# c++ vector

什么是C#等价的C++向量?

我正在寻找这个功能:

拥有连续存储内存的动态数组,对访问与标准数组没有性能损失.

我在搜索他们说.NET equivalent to the vector in C++ is the ArrayList,所以:

ArrayList是否具有连续的内存功能?

Dar*_*rov 91

你可以使用a List<T>和when T是一个值类型,它将被分配在连续的内存中,如果T是引用类型则不是这种情况.

例:

List<int> integers = new List<int>();
integers.Add(1);
integers.Add(4);
integers.Add(7);

int someElement = integers[1];
Run Code Online (Sandbox Code Playgroud)

  • 我不是100%熟悉CLR,但有意义的是,即使`T`是一个参考类型,你仍然会有连续的内存.它基本上是一个指针数组...... (4认同)
  • @cMinor,`List <T>`类的文档包含很多例子但是我已经更新了我的答案以包含一个. (2认同)

Bal*_*a R 16

List<T>.在内部它使用数组,并且数组确实使用连续的内存.

  • 嗯,我知道.但告诉我.你有一个List <SomeClass>.对SomeClass实例的引用将存储在连续的内存中,但不会存储在实例本身中.作为引用类型,它们将在堆中,您肯定知道堆如何工作. (13认同)
  • +1.为什么人们坚持甚至提到`ArrayList`? (7认同)
  • @MatteoMosca OP要求"访问与标准阵列没有性能损失".无论T是什么,List <T>都是如此,所以你在这个页面上的所有评论都是偏离的. (5认同)
  • 不完全正确.如果T是引用类型,则不会有连续的内存. (2认同)
  • @Matteo如果你看一下源代码,就会有`private T [] _items;`用于后端存储,引用类型与否. (2认同)

Mat*_*sca 16

首先,远离ArraylistHashtable.这些类被认为是不赞成的,有利于泛型.它们仍然是用于遗留目的的语言.

现在,你要找的是List<T>班级.请注意,如果T是值类型,您将具有连续内存,但是如果T是引用类型则不会,原因显而易见.


Arm*_*yan 13

C#有很多引用类型.即使容器连续存储引用,对象本身也可能分散在堆中