2013-04-24 54 views
0

我的問題很簡單..使用MemoryStream分配內存

當傳遞一個MemoryStream對象時,內存緩衝區(byte [])會在內存中再次分配嗎?

問題來自內存碎片的位置,這可能在大型系統中存在問題。

+3

你的意思是 「通過」 流?你的意思是把它從一種方法傳給另一種方法?這對內存分配沒有影響。 – 2013-04-24 17:40:47

+0

是的,我的意思是將流作爲參數傳遞給方法或ctor。所以內部字節數組不會重新分配? – 2013-04-24 17:44:29

+0

你有特定的場景嗎?例如,如果您聲明byte [100]並將其提供給內存流,那麼這是100個字節加上更改。但是如果你得到一個xml文件的byte []表示,現在你有一個xml文件和內存中的字節數組的副本。我沒有反編譯器,但他們說MemoryStream只是一個字節數組的包裝。所以沒有理由在其中有多個副本。 – MatthewMartin 2013-04-24 17:45:36

回答

4

這取決於。如果您通過構造函數從byte []初始化MemoryStream,則:no。 MemoryStream將拒絕調整大小,因爲它只是您現有緩衝區上的一個窗口。

如果您創建一個新的MemoryStream 而沒有傳入一個緩衝區,那麼您將一個緩衝區寫入內存流 - 那麼:是的。在這種情況下,即使緩衝區恰好具有相同的字節內容,它們也是無關的。

編輯:澄清 - 我只是指建設。之後,當你傳遞它時:不,當然不會重複。它是一個類:只傳遞對單個對象的引用。

+0

+1由於某種原因我記得布爾參數是用於調整大小的; p – leppie 2013-04-24 17:45:15

3

編號傳遞任何對象時,只是簡單地傳遞該對象的引用。你仍然引用相同的MemoryStream,它仍然引用相同的內部緩衝區。沒有什麼是重新分配的。

1

在C#中,每個非值類型實際上都是引用之下的引用,所以當您將MemoryStream傳遞給方法時,您應該只將參考傳遞給MemoryStream,而不是MemoryStream的副本。

http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx#vclrfpassingmethodparameters_referencetypes

+2

每一個*類*,都是一個引用類型。用戶定義的結構是值類型,而不是引用類型。 – Servy 2013-04-24 17:48:04

+0

是的,爲了澄清,基本類型在C#中被稱爲值類型,並且類似int或decimal或結構。 http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx – 2013-04-24 17:52:02

+0

「基本類型」和「非基本類型」不是C#規範中定義的術語,也不是C#社區常用術語,所以你的定義充其量只是含糊不清。請注意,您的鏈接不會在任何地方使用「基本」一詞。想到的最接近的術語將是一個「構建int類型」[在您的鏈接中引用](http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx),但不僅如此不包括所有值類型(它不包括用戶定義的結構和枚舉),但甚至包括幾個引用類型('string'和'object')。 – Servy 2013-04-24 17:57:48