在C#中,当使用值类型数组或引用类型数组时,数据将更加密集地打包在一起吗?
我的推理是,一个结构数组将所有数据放在一起,现在,虽然引用类型(所有引用都在一起)也是一样的,但是它们可以指向整个地方。
(我意识到,只要有可能,就鼓励使用C#的集合接口,而且可读的代码胜过过早的优化,但我只是好奇它是如何工作的。)
发布于 2014-10-30 14:31:45
这取决于你如何定义密集的包装。是的,引用将无处不在,但您也应该考虑分配数组所需的内存大小。
一个引用数组将需要一个较小的连续内存块,然后是一个大型结构数组。结构将以内联方式存储,因此每个数组元素将彼此之间的距离更远。对于引用,每个数组元素本质上都是指向引用的指针,因此每个元素都更小,因此元素更接近于一起。
要考虑的另一个问题是数组需要一个连续的内存块。如果在大型对象堆上分配碎片是一个问题,因为GC没有对其进行压缩,那么对于大型数组来说,您更有可能摆脱内存异常。即使您有足够的空闲内存,由于碎片,您可能没有足够的空闲连续内存。一个大型结构的数组比一个引用数组需要更多的连续内存。
这并不是真正直接适用的,而是在考虑数组的内存需求时需要考虑的其他问题。对于具有容量属性的基础类型使用数组的集合,通常通过分配一个比前一个数组大一倍的新数组并将元素复制到新数组来增长集合。这意味着,如果您有一个256项的集合并添加了一个257项,则会分配一个新的512元素数组,并将这些项复制到其中。256项数组将被解除分配,但是在复制过程中,集合需要768项的内存(但不是连续的,256数组+ 512数组)。因此,您可以有足够的空闲内存用于512项,但不能满足700项,因此,如果您试图添加257项,那么在内存不足的情况下,扩展集合就会失败。因此,有时,增加一个集合需要占用的内存是目前的3倍。这与连续内存需求相结合,当你似乎有足够的内存时,你就可以得到内存异常。
发布于 2014-10-30 14:28:57
如果你说的是处理器实际上会咀嚼的数据,那么是的,结构更“密集”(即。它不是需要取消引用的内存地址)。
但是,您需要更清楚地了解您想要实现的目标--听起来您正在尝试优化一些东西,将一个类数组更改为一个结构数组并不一定会更快。这将取决于您的数据是什么,以及如何使用它。
https://stackoverflow.com/questions/26664264
复制