Array.Empty<int>():为什么Rider显示存在分配,但BenchmarkDotNet没有?

3
第一张图片中使用的内存工具来自Rider。据我所知,它显示了对托管堆的分配。第二张图片显示了BenchmarkDotNet的结果。
为什么Rider显示进行了分配,但BenchmarkDotNet表明没有向堆进行分配?
如果我使用下面的代码示例,则BenchmarkDotNet会检测到分配:
var i = new int[0];

Rider memory tool results

BenchmarkDotNet results

1个回答

5

Array.Empty 指向一个框架已经静态分配的数组(请参见此处)。

当调用 new int[0] 时,实际上会为您分配一个新的大小为0的数组。

参见这个答案


感谢提供的链接。我有点困惑,因为Rider在第一行代码运行之前就显示了前4个int数组已经初始化(如上图所示)。只有在调用Array.Empty之后,Rider的内存工具才会捕捉到“默认”的int [0]。Rider甚至显示System.Int32 []的总分配字节数从3600增加到3624。 - user3476332
静态分配在这里意味着它发生在 Array 类的第一次使用时。因此,也许 BenchmarkDotNet 在其基准测试框架中需要一个数组,并且静态数组已经被创建了,但是在简单应用程序中,在主方法中的第一件事情中它尚未被创建。因此,两个不同的上下文有两种不同的行为。 - Ralf
@Ralf 当你这么说的时候,我看不到其他可能性。谢谢你的解释。 - user3476332
Tomer,虽然你提供的第二个链接很有用,但它并没有真正关注你提到的静态行为。你可能会喜欢Gravell先生的这个答案,其中描述了静态行为。该帖子随后分支出更多Skeet先生的帖子。 - user585968

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接