首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >罗斯林ObjectPool结构包装器

罗斯林ObjectPool结构包装器
EN

Stack Overflow用户
提问于 2015-09-17 10:33:52
回答 2查看 309关注 0票数 8

我在看罗斯林ObjectPool实现( https://github.com/dotnet/roslyn/blob/master/src/Compilers/Core/SharedCollections/ObjectPool%601.cs ),我不明白为什么他们不简单地选择拥有一个T数组,而是将T包装在一个结构中?

代码语言:javascript
复制
[DebuggerDisplay("{Value,nq}")] 
private struct Element 
{ 
    internal T Value; 
} 
...
private readonly Element[] _items;

这样做的目的是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-17 10:57:03

这是在设置作为引用类型的数组项时避免性能问题的常见技巧。数组在CLR (和JVM上)上是不同的。您可以将string写入object[]。这需要运行时检查,以确保没有将字符串实际存储到SomethingElse[]中。使用该值类型技巧,不需要在运行时执行该检查。

票数 5
EN

Stack Overflow用户

发布于 2015-09-17 11:35:44

我相信这是因为表现方面的原因。结构数组是垃圾收集器的朋友,而不是类的数组。

来自避免自动GC收集的5条技巧和技巧

对于一个类实例数组,GC必须检查该数组中的每个项,以确定它是否是活动对象(对于使用内部数组的泛型集合也是如此)。对于一个结构数组,GC只是查看数组本身是否仍然是一个活动对象,因为结构不能为空(即使对于Nullable结构也是如此,它只是使用内部跟踪机制来确定无效性)。因此,这可能是在运行集合时GC不需要检查的数千甚至数百万项!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32628223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档