有谁知道这两者之间的记忆差异?或者人们如何轻易地解决这个问题?
答案 0 :(得分:15)
对于32位CLR,两者都有4个字节用于锁定,4个字节用于类型句柄,8个字节用于两个整数。但是,该数组将有额外的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#的类型系统中表示,它们并不是非常有用,但它们提供了一个有趣的数据点。
答案 1 :(得分:0)
Tuple<int, int>
使用与具有两个整数字段的类相同的内存。另一方面,数组有一个相当大的内部数据结构(在SSCLI中称为ArrayOpScript
),至少32字节加上另一个数据结构(称为ArrayOpIndexSpec
)大小为16字节的等级(在本例中为1)。因此,阵列几乎肯定会使用比Tuple
更多的内存因素。