在C#中创建long[]
时,由于CLR中任何对象的2GiB大小限制,我希望它能够容纳最多2GiB / 64位= 268,435,456个元素。但是,在抛出异常之前,数组实际可以容纳的最大元素数是268,435,448。此外,long[][]
可以容纳具有上述元素数的多个long[]
,因此远大于2GiB。我的问题是:
答案 0 :(得分:2)
那些无法分配的64个字节在哪里。它们用于CLR的是什么?
其中一部分用于对象标题(同步块和vtable指针,两个指针)和数组维度的一部分。此外,托管堆本身可能使用了一些指针,因为一个大的对象需要一个单独的堆。
为什么二维数组大于2GiB?
因为它不是单个CLR对象。每个内部数组都是一个限制为2GB的独立对象,外部数组只保存对内部数组的引用。