【问题标题】:C# equivalent of C++ vector, with contiguous memory?C# 等效于 C++ 向量,具有连续内存?
【发布时间】:2011-10-20 01:41:16
【问题描述】:

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

我正在寻找这个功能:

拥有一个由连续存储的内存组成的动态数组,与标准数组相比,访问没有性能损失。

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

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

【问题讨论】:

  • CLR 是否不够接近金属,无法指定(甚至始终期望)结构在内存中的分配方式?

标签: c# c++ vector


【解决方案1】:

您可以使用List<T>,当T 是值类型时,它将被分配到连续的内存中,如果T 是引用类型,则不会出现这种情况。

例子:

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

int someElement = integers[1];

【讨论】:

  • @cMinor,List&lt;T&gt; 类的文档包含许多示例,但我已更新我的答案以包含一个。
  • 我对 CLR 不是 100% 熟悉,但即使 T 是一个引用类型,你仍然有连续的内存是有道理的。它基本上是一个指针数组...
  • “如果 T 是引用类型,情况就不会如此” - 与T[] 的情况一样...标准数组”,List&lt;T&gt; 提供了这一点。如果T 是一个引用类型,这类似于C++ 中的T*,所以你得到的连续性与C++ 中的一样多。如果希望对象本身是连续的,那么当然需要两种语言的值类型。当然,不同之处在于,在 C++ 中,任何类型都可以用作值或引用,而在 C# 中,它是通过类/结构区分的类型的属性。
  • 今天学到了一些东西。我认为List&lt;T&gt; 总是在内部实现为链表。那么当我们调用Add() 时它是如何动态扩展的呢?类似于 VB6 的 Redim Preserve 用于将整个数组复制到新位置?
  • @dotNet,内部List&lt;T&gt; 创建一个小数组T[]。内部的项目被添加到数组中。完成数组大小后,将创建一个新数组,其大小是前一个数组的两倍。数据被复制到新的较大的数组中,较小的被销毁,依此类推。开发人员可以提示 .NET 在通过构造函数填充List 之前创建足够大的内部数组:new List&lt;T&gt;(expected_array_size)
【解决方案2】:

使用List&lt;T&gt;。它在内部使用数组,而数组确实使用连续内存。

【讨论】:

  • 不完全正确。如果 T 是引用类型,则不会有连续内存。
  • @Matteo 如果你查看源代码,有private T[] _items; 用于后端存储,引用类型与否。
  • 嗯,我知道。但是告诉我。你有一个列表。对 SomeClass 实例的引用将存储在连续的内存中,而不是实例本身。作为引用类型,它们将在堆中,您肯定知道堆是如何工作的。
  • @MatteoMosca 连续存储引用至少消除了一级间接性。我猜总比没有好。
  • @MatteoMosca OP 要求“访问与标准阵列相比没有性能损失”。无论 T 是什么,List 都是如此,因此您在此页面上的所有 cmets 都是离点的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    首先,远离ArraylistHashtable。这些类将被视为已弃用,有利于泛型。出于遗留目的,它们仍然使用该语言。

    现在,您正在寻找的是 List&lt;T&gt; 类。请注意,如果 T 是值类型,您将拥有连续内存,但如果 T 是引用类型,则不会,原因很明显。

    【讨论】:

      【解决方案5】:

      看起来 CLR / C# 可能很快就会对 Vector 获得更好的支持。

      http://blogs.msdn.com/b/dotnet/archive/2014/04/07/the-jit-finally-proposed-jit-and-simd-are-getting-married.aspx

      【讨论】:

        猜你喜欢
        • 2013-03-14
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 2017-03-08
        • 2021-12-03
        • 2020-05-04
        • 1970-01-01
        相关资源
        最近更新 更多