CLR中一维和二维数组的最大大小

时间:2014-01-09 15:30:02

标签: c# .net arrays clr

在C#中创建long[]时,由于CLR中任何对象的2GiB大小限制,我希望它能够容纳最多2GiB / 64位= 268,435,456个元素。但是,在抛出异常之前,数组实际可以容纳的最大元素数是268,435,448。此外,long[][]可以容纳具有上述元素数的多个long[],因此远大于2GiB。我的问题是:

  • 无法分配那64个字节的位置。它们用于CLR的用途是什么?
  • 为什么二维数组大于2GiB?

1 个答案:

答案 0 :(得分:2)

  

那些无法分配的64个字节在哪里。它们用于CLR的是什么?

其中一部分用于对象标题(同步块和vtable指针,两个指针)和数组维度的一部分。此外,托管堆本身可能使用了一些指针,因为一个大的对象需要一个单独的堆。

  

为什么二维数组大于2GiB?

因为它不是单个CLR对象。每个内部数组都是一个限制为2GB的独立对象,外部数组只保存对内部数组的引用。