我有一个包含一些基本类型的类。 (3 倍 float ,2 倍整数)。
现在我需要一个可以容纳数百万个此类实例的集合。我不需要派生类型。所有元素都完全来自这个单一类。 此外,元素的数量是固定的。在极少数情况下,我计划复制整个列表/数组并修改副本。最初的列表/数组应该是不可变的,因此我不需要与其他线程同步。
现在的问题是:
- 我受益于数组而不是列表吗?
- 我可以使用数组来节省内存吗?
- 速度怎么样?
我读到 C# 中的列表在内部也是作为数组实现的。
如果是 C++,我知道数组会包含完整的对象。但我不确定 C# 是如何处理这个问题的。 C# 数组是仅保存对类实例的引用还是保存完整的数据结构?
最佳答案
The originally list/array shall be immutable, thus I don't need to synchronize with other threads.
您是否考虑过使用不可变集合而不是 T[]
或 List<T>
? <强> ImmutableArray<T>
最有意义。您可以使用 ImmutableArray<T>.Builder
以高效的方式创建集合。
- Do I benefit from an Array instead of a List?
如果您不需要更改元素的数量,您应该使用 Array。这会让所有查看您的代码的人清楚地知道您没有更改元素的数量。
- Do I save memory using an Array?
这取决于您如何创建 List<T>
.在内部,当您向 List<T>
添加元素时一个接一个底层数组的大小是使用 2* 乘数更改的:当没有足够的空间容纳新元素时,当前底层数组将被一个两倍大小的新元素替换。所以是的,您可以直接使用 Array 来节省内存,因为您不会分配任何不必要的内存。但是,您可以使用 List<T>
实现相同的效果,通过使用具有列表容量的构造函数或通过调用 TrimExcess
创建它将所有元素添加到列表后的方法。
- What about speed?
使用数组,您将保存生成 List<T>
的逻辑方法、属性和索引器属性调用转换为底层数组调用。但是你不应该关心它,它不会被注意到。
If it would be C++, I know that the array would hold the complete object. But I'm not sure how C# handles this. Will a C# array only hold references to the class instances or will it hold the complete datastructure?
这取决于。如果您将类型定义为引用类型(class
),则数组和列表都将只包含对特定项目的引用。如果您将其定义为值类型(struct
),数组将保存实际元素。
关于单个类类型的 C# 数组或列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26501498/