2013-04-24 85 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