memorystream自动分配内存空间的问题 ( 积分: 300 )

  • 主题发起人 主题发起人 啊啊啊啊啊
  • 开始时间 开始时间

啊啊啊啊啊

Unregistered / Unconfirmed
GUEST, unregistred user!
我先创建一个memorystream,然后对其进行copyfrom操作,发现数据量较大时,速度奇慢,但是当我先对memorystream设置大小后,速度是原来的数十倍,我想请教一下:当memorystream没有指定大小时,是如何自动分配内存空间的?

顺便提个相关的问题:根据下文描述,memorystream.SetSize后,原来的数据将消除,但我试了,原有的数据不变,只是大小发生变化,这是怎么回事呢?

SetSize方法消除内存流中包含的数据,并将内存流中内存池的大小设为Size字节。
 
Delphi 帮助中解释如下:
Use SetSize to set the Size of a memory stream before filling it with data. SetSize allocates the memory buffer to hold NewSize bytes, preserving as much of the existing data as possible.
意思是说“填写数据之前要用 SetSize 设置内存流的大小,SetSize 将内存缓冲区设置为 NewSize 位,[red]并尽可能保留原有数据[/red]。”
你的“SetSize方法消除内存流中包含的数据”是哪里来的?
 
好像是一本书上的吧,以前有人在论坛贴过

20.1 流式对象的实现原理和应用
.......
20.1.5.1 TMemoryStream的属性和方法

3. SetSize方法
SetSize方法消除内存流中包含的数据,并将内存流中内存池的大小设为Size字节。如果Size为零,是SetSize方法将释放已有的内存池,并将Memory属性置为nil;否则,SetSize方法将内存池大小调整为Size。
 
你没有设定的话,他要根据当前的传输的数据动态分配,这个空间是不确定的,你传一点就要分配一点,再传再分配,当然速度慢啊!你指定了,就省略了动态分配这个环节当然快了
 
这个问题很简单。我用简单的方法解释给你听。首先,如果不设置Size,那么在CopyFrom的时候,MemoryStream首先从源Stream读取一个Buf(假设它的长度是32K,这是假设,用来说明问题的,具体Buf的长度你可参看源码),然后把这个Buf写入MemoryStream(既调用MemoryStream.Write方法),在写入的过程中,MemoryStream分配一个Buf长度的内存(32K),然后把数据写进去,接着又从源Stream读取第二个Buf的数据,然后再用MemoryStream.Write的时候,MemoryStream会首先分配一个64K的内存块,然后把前面第一个Buf(即前32k数据)Move到这个新块内,然后再在这个块的后半部分写入新送入的Buf的数据。。。如此循环下去,数据越多,重复分配重复复制数据的操作就会越来越花费时间,于是拷贝数据的时间成几何方式增长下去了。。。。

如果你首先设置了Size的大小,那么内存只需要经过一次申请空间的操作,接下来就是直接把从源Stream读取的Buf数据Move到这一块内存块的不同位置而已了。这样当然就快了N倍。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
913
SUNSTONE的Delphi笔记
S
后退
顶部