有人知道这两者之间的内存差异吗?或者一个人自己如何轻松地弄清楚这一点?
最佳答案
对于 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 个额外字节。
引用文献:
- http://www.codeproject.com/KB/dotnet/arrays.aspx
- http://www.codeproject.com/KB/cs/net_type_internals.aspx?fid=459323&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2567811
- http://msdn.microsoft.com/en-us/magazine/cc301755.aspx
* 在 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/