2015-03-13 95 views
1

在我的程序中,我分配了很多数组(数百万),它们的大小都很小。在C#中分配一块内存?

因为重复分配一个大的内存块比重复内存块的速度要快,我一直在寻找一种方法来分配一个大块内存,保留一个指向该块中当前位置的指针来绘制下一个数组然后再分配另一个大块,当这个块耗尽时。

这是可能在C#中做的,如果是的话,如何?我有一种感觉Marshal.AllocHGlobal可能是我正在寻找的,但我不太确定C#是否有更好的管理方式。

作为一个例子,我想分配一个1000字节的内存块,然后创建一个长度为4的数组,使用前4个字节,然后创建一个长度为3的数组,使用下一个3个字节。

+1

阅读本文http://stackoverflow.com/questions/2648560/allocating-unmanaged-memory-in-c-sharp – Sorceri 2015-03-13 14:44:40

+0

@Ryan是的,你可以以各种方式分配内存,不,你不能让CLR使用您分配的内存作为/用于.NET Array/List /? – xanatos 2015-03-13 14:45:29

+0

你总是可以创建一个巨大的数组,并将其逻辑细分为更小的数组。 – Will 2015-03-13 14:47:39

回答

4

没有更多的上下文很难回答。但是这听起来像你正在寻找像ArraySegment这是一个抽象来访问数组的部分。

随着ArraySegment你可以创建一个单一的大型数组,并在逻辑上分割成多个段。

如果您创建的数百万个阵列寿命短,那么创建并忘记它们就可以了。垃圾收集器擅长处理短暂的引用。

记住垃圾收集的时间并不与您创建的对象数成正比,而是与垃圾收集中存活的对象数成正比。所以,如果你的对象是短命的,你最好创建许多数组。

如果超过85,000字节,创建一个巨大的数组是不好的事情,因为它将位于未在GC上压缩的LOH。 没有压实 - >碎裂的可能性很大

+0

不幸的是'ArraySegment'是一个半完成的工作......它不直接暴露甚至一个索引器。 (你可以把它投给'IList '来拥有它) – xanatos 2015-03-13 14:49:24

+0

这看起来很有希望。希望它很快。谢谢! – 2015-03-13 14:56:18