Re: copymemory basic question
- From: "Tony Proctor" <tony_proctor@xxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
- Date: Tue, 30 Aug 2005 19:39:59 +0100
I think you might be misinterpreting your own results here. The VB Optimiser
isn't doing much at all (as usual), and certainly not tracking String
addresses. The String data is held in BSTR memory packets. These, in turn,
reside in an OLE string pool. They may be deallocated/allocated using
oleaut32 APIs such as SysFreeString and SysAllocString. VB simply uses these
APIs. Also, VB allocates new packets each time a string is assigned from one
variable to another (except in the special case mentioned by Thorsten). What
you're seeing is the result of the string pool returning previously-used,
but now free, memory addresses. There's a high chance of re-using the same
memory addresses in your code because the various string variables hold the
same value, and so will require the same amount of memory.
Tony Proctor
"Someone" <nobody@xxxxxxx> wrote in message
news:oc0Re.6919$ct5.2257@xxxxxxxxxxxxx
> On a second thought, it seems that the optimizer in VB copies the pointers
> to strings instead of swapping the contents. I didn't know that. It seems
> that it also keeps track of the last few strings used, even if you
assigned
> a different value. However, I don't think that it's a good idea to rely on
> whether the optimizer can do it or not, it's best to test it with a timing
> routine to see which method is faster. Even with this optimization, it
might
> be slower than "Swapping arrays of Longs representing the Indexes of
> strings", because it seems that VB uses internal memory management
functions
> when it does this during runtime.
>
>
> Here is a test sample I did and its output:
>
> Private Sub Form_Click()
> Dim s1 As String
> Dim s2 As String
> Dim temp As String
>
> s1 = "abc"
> s2 = "def"
> temp = ""
>
> ' Set some form properties so the output can be seen clearly when in
> EXE.
> Me.AutoRedraw = True
> Me.FontName = "Courier"
>
> Debug.Print " s1", , " s2", , " temp"
> Debug.Print "Before: "; VarPtr(s1); StrPtr(s1), VarPtr(s2);
> StrPtr(s2), VarPtr(temp); StrPtr(temp)
>
> temp = s1
> Debug.Print "After temp = s1: "; VarPtr(s1); StrPtr(s1), VarPtr(s2);
> StrPtr(s2), VarPtr(temp); StrPtr(temp)
> s1 = s2
> Debug.Print "After s1 = s2: "; VarPtr(s1); StrPtr(s1), VarPtr(s2);
> StrPtr(s2), VarPtr(temp); StrPtr(temp)
> s2 = temp
>
> Debug.Print "After s2 = temp: "; VarPtr(s1); StrPtr(s1), VarPtr(s2);
> StrPtr(s2), VarPtr(temp); StrPtr(temp)
>
> End Sub
>
>
>
> OUTPUT(Copy to Notepad to see it clearly):
>
>
> s1 s2
temp
> Before: 1308792 1530892 1308788 2193116
> 1308784 1530932
> After temp = s1: 1308792 1530892 1308788 2193116
> 1308784 2217996
> After s1 = s2: 1308792 1530932 1308788 2193116
> 1308784 2217996
> After s2 = temp: 1308792 1530932 1308788 1530892
> 1308784 2217996
>
> My environment: Windows XP with SP2, and VB6 with SP5.
>
>
.
- Follow-Ups:
- Re: copymemory basic question
- From: Someone
- Re: copymemory basic question
- References:
- copymemory basic question
- From: mscir
- Re: copymemory basic question
- From: Sam Hobbs
- Re: copymemory basic question
- From: Tony Proctor
- Re: copymemory basic question
- From: Sam Hobbs
- Re: copymemory basic question
- From: Tony Proctor
- Re: copymemory basic question
- From: Sam Hobbs
- Re: copymemory basic question
- From: Tony Proctor
- Re: copymemory basic question
- From: Tony Proctor
- Re: copymemory basic question
- From: mscir
- Re: copymemory basic question
- From: J French
- Re: copymemory basic question
- From: Thorsten Albers
- Re: copymemory basic question
- From: Sam Hobbs
- Re: copymemory basic question
- From: Thorsten Albers
- Re: copymemory basic question
- From: Someone
- copymemory basic question
- Prev by Date: Re: copymemory basic question
- Next by Date: Re: Connecting to the Internet
- Previous by thread: Re: copymemory basic question
- Next by thread: Re: copymemory basic question
- Index(es):
Relevant Pages
|