在C#中分配一块内存?

时间:2015-03-13 14:41:40

标签: c# arrays memory memory-management allocation

在我的程序中,我分配了很多数组(数百万)并且它们都非常小。

因为重复分配大块内存比小块内存更快,我正在寻找一种方法来分配大块内存,保持指向该块中当前位置的指针以从中抽取下一个数组,然后在那个用尽的时候分配另一个大块。

这可以用C#做​​,如果有,怎么做?我有一种感觉Marshal.AllocHGlobal可能正是我正在寻找的,但我不太确定C#是否有更多管理方式。

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

1 个答案:

答案 0 :(得分:4)

没有更多背景,很难回答。但听起来你正在寻找类似ArraySegment的东西,它是访问数组部分的抽象。

使用ArraySegment,您只需创建一个大型数组,然后在逻辑上将其拆分为多个段。

如果您创建的数百万个数组是短暂的,那么创建并忘记它们就可以了。垃圾收集器善于处理短期引用。

记住,垃圾收集所花费的时间与您创建的对象数量不成正比,但与垃圾收集中存在的对象数量成正比。因此,如果您的对象是短暂的,那么最好创建许多数组。

如果它超过85,000字节,那么创建一个巨大的数组是一件坏事,因为它将位于LOH中,而不是在GC上压缩。 没有压缩 - >碎片的可能性很大