0

我不認爲公平地發表評論Fredrik Mörk的回答this 2 year old post,所以我想我只是問它作爲一個新的問題,而不是......對象數組到字節數組 - Marshal.AllocHGlobal碎片查詢

注意:這不是一個關於任何方式的答案的批判,我只是試圖在鑽研內存管理/元帥課程之前瞭解這一切。

在該答案中,函數GetByteArray將內存分配給循環內給定數組內的每個對象。

會就上述職位的GetByteArray功能什麼好處,從分配的內存來提供陣列的總大小:

Dim arrayBufferPtr = Marshal.AllocHGlobal(Marshal.SizeOf(<arrayElement>) * <array>.Count) 

我只是想知道,如果如圖所示的答案,分配內存,原因任何形式的碎片?假設可能存在分散性,是否會有很多影響需要關注?以我所顯示的方式分配內存將迫使您調用IntPtr.ToInt ##以從總體分配指針獲取指針偏移量,並因此強制您檢查基礎架構以確保使用正確的方法* 1或者,還有更好的方法? (ToInt32/ToInt64根據86/64?)

* 1我看其他地方調用錯誤IntPtr.ToInt ##會導致溢出異常。我的意思這句話是我會用:

Dim anOffsetPtr As New IntPtr(arrayBufferPtr.ToInt## + (loopIndex * <arrayElementSize>)) 

我已經通過在VB.Net Marshal類和內存分配的幾篇文章閱讀;下面列出,但如果你知道任何其他好的文章,我都耳朵!

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.aspx

http://www.dotnetbips.com/articles/44bad06d-3662-41d3-b712-b45546cd8fa8.aspx

我最喜歡迄今: http://www.codeproject.com/KB/vb/Marshal.aspx

回答

2

有可能分配非託管內存爲整個數組,然後用中SizeOf每個數組元素複製(arrayElement) * loopIndex偏移量。根據目前的平臺,最好使用適當的ToInt32/ToInt64方法,如:

 
Dim anOffsetPtr 
if arrayBufferPtr.Size = 4 then 
    anOffsetPtr = New IntPtr(arrayBufferPtr.ToInt32() + (loopIndex * arrayElementSize)) 
else 
    anOffsetPtr = New IntPtr(arrayBufferPtr.ToInt64() + (loopIndex * arrayElementSize)) 
endif 
+0

哦,當然。我沒有想過檢查IntPtr的大小,實際上沒有看到代碼表明,已經在考慮確定平臺的最佳方式。 +1(可能在適當的時候回答)。我不認爲你知道任何好的文章? - 那裏一定有更多,例如,提到IntPtr.Size技巧......? – Smudge202 2011-06-14 14:23:29

+0

注意; C#示例可能也很好 - 我更喜歡上面的double equals。查找不直接轉換爲VB的C#代碼變通辦法也很好玩。 ^^ – Smudge202 2011-06-14 14:25:18

+0

@ Smudge202 - 我只使用元帥類參考,對於每個在託管和非託管編程方面都有經驗的人來說,這是絕對清楚的。對不起,語法錯誤,VB不是我的母語:) – 2011-06-14 14:31:09