c# - 为什么分配的内存比预期的多?

标签 c# memory benchmarkdotnet

我正在使用 BenchmarkDotNet 及其 MemoryDiagnoser 功能。

考虑以下基准:

[Benchmark]
public void Dummy()
{
   var buffer = new byte[1];
}

我希望它恰好分配 1 个字节。

但是基准测试结果显示总共分配了 32 个字节。怎么来的?我觉得这很有误导性。
| Method |     Mean |     Error |    StdDev |   Median | Ratio | Rank |  Gen 0 | Gen 1 | Gen 2 | Allocated |
|------- |---------:|----------:|----------:|---------:|------:|-----:|-------:|------:|------:|----------:|
|  Dummy | 4.486 ns | 0.1762 ns | 0.5196 ns | 4.650 ns |  1.00 |    1 | 0.0038 |     - |     - |      32 B |

                                                                                      why not 1 byte? ^^^^

最佳答案

我是 MemoryDiagnoser 的作者,我已经描述了如何阅读我的博客的结果:https://adamsitnik.com/the-new-Memory-Diagnoser/#how-to-read-the-results

CLR does some aligning. If you try to allocate new byte[1] array, it will allocate byte[8] array.

We need extra space for object header, method table pointer and length of the array. The overhead is 3x Pointer Size. 8 + 3x4 = 20 for 32bit and 8 + 3x8 = 32 for 64bit.

关于c# - 为什么分配的内存比预期的多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60249021/

相关文章:

c# - 使用 LINQ 将数据插入到使用序列作为主键生成器的表中

java - Tomcat提交异常数量的虚拟内存并且不释放它

java - 向 Java 列表添加/删除条目是否会重新分配内存?

f# - 如何限制 BenchmarkDotNet 作业仅在特定平台上运行?

c# - 仅显示 BenchmarkDotNet 的摘要部分

c# - .net 框架是否支持在不同版本 1.1 和 3.5 之间使用策略文件进行程序集重定向?

c# - 使用带有 <%@ Register %> 的空 TagPrefix

php - 最快的 PHP 内存缓存/哈希表

c# - 获取显示器的纵横比