什么是记忆的布局中的一个。净阵?

例如采取这一阵列:

Int32[] x = new Int32[10];

我的理解是,大量的阵列是这样的:

0000111122223333444455556666777788889999

这里的每一个字一个字和数字对应索引入阵列。

此外,我知道,有一种类型的参考和syncblock指数,为所有对象,因此,可以将上述调整:

ttttssss0000111122223333444455556666777788889999
        ^
        +- object reference points here

此外,该阵列的长度需要储存,因此,也许这更多的是正确的:

ttttssssllll0000111122223333444455556666777788889999
        ^
        +- object reference points here

这是完整的?是否有更多的数据在一系列?

的原因,我要问的是,我们正在试图估计有多少内存的几个不同的存中陈述的一个相当大的数据集将采取的大小和该阵列的变化相当一点,因此开销可能会有一大影响在一个解决方案,但或许没有那么多。

所以基本上,对于一系列多少开销是有的,这基本上是我的问题。

和之前 阵列是坏的 队醒来,这一部分的解决方案是一个静态的建立一旦参考-经常类型的事情,所以使用可增长名单没有必要在这里。

有帮助吗?

解决方案

大问题。我发现这个制品,其包含框图两个值类型和引用类型。另请参阅此文章其中Ritcher规定:

  

[剪断]每个阵列具有一些附加   与相关的开销信息   它。此信息包含秩   阵列的(维数),   对于每个维度的下限   阵列(几乎总是0),并且   每个维度的长度。开销   还包含每个元素的类型   在阵列。

其他提示

一种方式来研究这个是看码在WinDbg.所以给代码下面,让我们来看看如何出现的堆。

var numbers = new Int32[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

要做的第一件事就是找到的实例。作为我做了这个地方 Main(), ,很容易找到地址的实例。

从地址我们可以把实际的实例,这给了我们:

0:000> !do 0x0141ffc0
Name: System.Int32[]
MethodTable: 01309584
EEClass: 01309510
Size: 52(0x34) bytes
Array: Rank 1, Number of elements 10, Type Int32
Element Type: System.Int32
Fields:
None

这告诉我们,这是我们的Int32列有10个单元和一个全尺寸的52字节。

让我们转储存在那里的实例。

0:000> d 0x0141ffc0
0141ffc0 [84 95 30 01 0a 00 00 00-00 00 00 00 01 00 00 00  ..0.............
0141ffd0  02 00 00 00 03 00 00 00-04 00 00 00 05 00 00 00  ................
0141ffe0  06 00 00 00 07 00 00 00-08 00 00 00 09 00 00 00  ................
0141fff0  00 00 00 00]a0 20 40 03-00 00 00 00 00 00 00 00  ..... @.........
01420000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
01420010  10 6d 99 00 00 00 00 00-00 00 01 40 50 f7 3d 03  .m.........@P.=.
01420020  03 00 00 00 08 00 00 00-00 01 00 00 00 00 00 00  ................
01420030  1c 24 40 03 00 00 00 00-00 00 00 00 00 00 00 00  .$@.............

我已经插入方括号为52字节。

  • 第四个字节的参考方法表在01309584.
  • 然后四个字节的长度阵列。
  • 以下的数字,0至9(每四个字节)。
  • 最后四个字节是空。我不能完全肯定,但我想,这必须在那里的参考syncblock阵储存,如果实例是用于锁定。

编辑:忘了长在第一次张贴。

该清单略有不正确的,因为作为romkyns指出实例实际上开始的地址-4和第一个领域是Syncblock.

大问题!我想看看它自己,它似乎是一个很好的机会,尝试Cordbg.exe的......

似乎为简单的整数数组,格式是:

ssssllll000011112222....nnnn0000

其中s是同步块,升的阵列的长度,然后将单独的元件。它似乎有一个最终0结尾,我不知道这是为什么。

有关多维数组:

ssssttttl1l1l2l2????????
    000011112222....nnnn000011112222....nnnn....000011112222....nnnn0000

其中S是同步块,叔元件的总数,L1第一维的长度,L2第二维的长度,然后两个零?,随后所有的元素顺序,最后又一个零

对象阵列被作为整数数组进行处理,内容是引用这个时候。铁血阵列对象的阵列,其中的引用指向其他阵列。

数组对象将不得不存储它多少维度具有和每个维度的长度。因此,有至少一个或多个数据元素添加到模型

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top