Re: copymemory basic question



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.
>
>


.



Relevant Pages

  • Re: How Globals is handle in C.
    ... > "Hello World" string will be stored in the Initialized data segment. ... I think> temp is stored in stack if you have not declared it as global. ... The C language says nothing about an "initialized data segment" or "read only memory". ...
    (comp.lang.c)
  • Evangelism in googleland (was: How Globals is handle in C.)
    ... >> segment. ... In that it is stored in Read Only Memory. ... >> temp will store the starting address of this Read Only string. ...
    (comp.lang.c)
  • Re: Static Class Constants (VB 2005)
    ... It depends on the optimizer. ... string should be caught and converted to a constant at compile time. ... > Exact this answer was what I expected and than I find a read-only property ...
    (microsoft.public.dotnet.languages.vb)
  • Re: [EGN] Variable hoisting
    ... > about programming such as inappropriate variable hoisting. ... I just did a simple program that used your "strleninside the loop ... silliness and did test runs with optimizer disabled, ... even with a relatively short string. ...
    (comp.programming)
  • Re: why is pattern matching using | slower than 2 separate ones?
    ... > the string to swap between looking for one then the other. ... > the engine from doing certain optimisations which are easy with the simple ... The REx engine ... It is the optimizer ...
    (comp.lang.perl.misc)

Quantcast