Array.Empty<int>():为什么 Rider 显示分配已发生,而 BenchmarkDotNet 却没有?

Array.Empty<int>(): Why does Rider show an allocation occurred, but BenchmarkDotNet doesn't?

第一张图片中使用的记忆工具来自Rider。据我所知,它显示了对托管堆的分配。第二张图片显示了 BenchmarkDotNet 的结果。

为什么 Rider 显示已进行分配,但 BenchmarkDotNet 却显示未对堆进行分配?

如果我改用下面的代码示例,BenchmarkDotNet 会选择分配:

var i = new int[0];

Array.Empty 指向框架已经静态分配的数组(参见 here)。

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

另请参阅此 answer