.net - Tuple<int, int> 与 int[2] 内存使用情况

标签 .net

有人知道这两者之间的内存差异吗?或者一个人自己如何轻松地弄清楚这一点?

最佳答案

对于 32 位 CLR,两者都有 4 个字节用于锁,4 个字节用于类型句柄,8 个字节用于两个 int。然而,该数组将有额外的 4 个字节来存储长度(本例中为 2 个字节),因此该数组将有 4 个字节的开销。

32 位上的大小(通过分析确定):
Tuple<int, int> :16字节
int[2] :20字节
int[1 to 2] *:28字节
int[2, 1] :36字节
在 64 位 CLR 上:
Tuple<int, int> :24字节
int[2] :32字节
int[1 to 2] *:40字节
int[2, 1] :48字节

请注意,从零开始的单维值类型数组是最小的可能数组。使用引用类型会为所存储的对象类型添加另外 4 个字节(64 位上为 8 个字节)。使用非零数组基数或多维使其使用另一种数组类型来存储排名和下限信息,为每个维度添加 8 个额外字节。

引用文献:

* 在 C# 中不能声明下限非 0 的数组,因此我编写了语法 int[1 to 2] 。不过您可以调用Array.CreateInstance(typeof(int), new[]{2}, new[]{10});创建一个包含 2 个元素的数组,索引为 10 和 11。当然,由于此类数组无法直接在 C# 的类型系统中表示,因此它们并不是很有用,但它们提供了一个有趣的数据点。

关于.net - Tuple<int, int> 与 int[2] 内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4676249/

相关文章:

c# - 为什么 Reflection 的 GetProperty() 或 GetField() 不是实例或扩展方法?

.net - 我可以使用 ODAC 11g 访问 10g

.net - .AddMvc() 在 ASP.NET Core 3.0 中?

c# - 是否可以在 C# 中观察 Rss 提要的变化?

c# - 如何在C#中读取域名的TXT记录?

c# - 如何将字节数组解析为对象?

c# - 将 string[] 转换为 ObservableCollection<string>

c# - 如何在C#中获取包含特定 "price"的XML元素范围

.net - Azure Web 角色如何在没有入口点的情况下运行?

.net - 无法加载文件或程序集 'AutoMapper' 或其依赖项之一