C#等效于C ++向量,具有连续内存?


85

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

我正在搜索此功能:

拥有一个连续存储的动态数组,与标准数组相比,其访问性能不会受到影响。

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

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


4
CLR是否不足够接近金属以供您指定(甚至一直期望)内存中的结构分配方式?
Aphex

Answers:


101

您可以使用a List<T>,当T是值类型时,它将分配在连续的内存中,如果T是引用类型则不会。

例:

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

int someElement = integers[1];

2
@cMinor,List<T>该类的文档包含许多示例,但我已经更新了答案以包括其中一个。
Darin Dimitrov

5
我不是100%熟悉CLR,但即使T是引用类型,您仍然会有连续的内存,这是有道理的。它基本上是一个指针数组...
josaphatv

“如果T是引用类型,则不会是这种情况”-情况与T[]...一样多。OP要求“对访问标准数组不造成性能损失”,并List<T>提供了这一点。而且如果T是引用类型,则类似于T*C ++,因此您可以获得与C ++一样多的连续性。如果人们希望对象本身是连续的,那么当然需要两种语言的值类型...。当然,区别在于,在C ++中,任何类型都可以用作值或ref,而在C#中,通过类/结构区分,它是该类型的属性。
吉姆·巴尔特

今天学到一些东西。我以为List<T>总是在内部实现为链接列表。那么,当我们打电话时,它如何动态扩展Add()?VB6之类的东西Redim Preserve曾经用于将整个阵列复制到一个新位置?
dotNET

@dotNet在内部List<T>创建一个小数组T[]。内部项目将添加到数组中。数组大小完成后,将创建一个新数组,大小是前一个数组的两倍。数据被复制到新的较大数组,较小的数组被销毁,依此类推。开发人员可以提示.NET在填充List via构造函数之前创建足够大的内部数组:new List<T>(expected_array_size)
Artru

16

使用List<T>。在内部它使用数组,而数组确实使用连续内存。


2
并非完全正确。如果T是引用类型,则不会有连续的内存。
Matteo Mosca

2
@Matteo,如果您查看源代码,则 private T[] _items;该文件用于后端存储,无论引用类型与否。
Bala R

13
好吧,我知道。但是告诉我。您有一个List <SomeClass>。对SomeClass实例的引用将存储在连续的内存中,而不是实例本身。作为引用类型,它们将在堆中,并且您当然知道堆是如何工作的。
Matteo Mosca

@MatteoMosca连续存储引用至少可以消除一个间接级别。总比没有好。
Tim Seguine 2014年

7
@MatteoMosca OP要求“与标准阵列相比,访问性能不受影响”。无论T是什么,List <T>都是如此,因此您在此页面上的所有评论都是断点。
吉姆·巴尔特

16

首先,请远离ArraylistHashtable。这些类被认为是不推荐使用的,而赞成泛型。它们仍然是出于遗留目的而使用的语言。

现在,您正在寻找的是List<T>课程。请注意,如果T是值类型,则将有连续内存,但如果T是引用类型,则没有明显的原因。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.