2015-03-13 33 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