我在看罗斯林ObjectPool实现( https://github.com/dotnet/roslyn/blob/master/src/Compilers/Core/SharedCollections/ObjectPool%601.cs ),我不明白为什么他们不简单地选择拥有一个T数组,而是将T包装在一个结构中?
[DebuggerDisplay("{Value,nq}")]
private struct Element
{
internal T Value;
}
...
private readonly Element[] _items;这样做的目的是什么?
发布于 2015-09-17 10:57:03
这是在设置作为引用类型的数组项时避免性能问题的常见技巧。数组在CLR (和JVM上)上是不同的。您可以将string写入object[]。这需要运行时检查,以确保没有将字符串实际存储到SomethingElse[]中。使用该值类型技巧,不需要在运行时执行该检查。
发布于 2015-09-17 11:35:44
我相信这是因为表现方面的原因。结构数组是垃圾收集器的朋友,而不是类的数组。
对于一个类实例数组,GC必须检查该数组中的每个项,以确定它是否是活动对象(对于使用内部数组的泛型集合也是如此)。对于一个结构数组,GC只是查看数组本身是否仍然是一个活动对象,因为结构不能为空(即使对于Nullable结构也是如此,它只是使用内部跟踪机制来确定无效性)。因此,这可能是在运行集合时GC不需要检查的数千甚至数百万项!
https://stackoverflow.com/questions/32628223
复制相似问题