On Fri, Jun 22, 2007 at 02:31:07PM +0200, demerphq wrote:
> On 6/22/07, Peter Scott <[EMAIL PROTECTED]> wrote:
> >On Thu, 21 Jun 2007 22:33:03 +0100, Tim Bunce wrote:
> >> On Thu, Jun 21, 2007 at 06:47:11PM +0200, Rafael Garcia-Suarez wrote:
> >>> On 21/06/07, Steve Hay <[EMAIL PROTECTED]> wrote:
> >>> >I remember lots of discussion a while ago about constructions like "my
> >>> >$x = 1 if $y;". I don't remember what the conclusion of it all was,
> >>> >except that it's probably best avoided. Is that right?
> >>>
> >>> Yes, that's right, because that could bypass initialisation of $x if
> >>> $y is false, leaving the previous value in it, like in state vars.
> >>
> >> I thought that issue only related to a "compile-time constant false"
> >> (such as the one in your example) and not to a runtime expression that
> >> happened to be false sometimes.
> >>
> >> Looking at it another way, are you saying that (ignoring closures)
> >> subroutine scoped lexicals are not cleared when the subroutine exits,
> >> but persist (consuming memory) until the subroutine is reentered?
> >
> >$ ./perl -wle '$q = shift; sub foo { my $x if $q; print $x // $]; \
> >                                     $x = 42 } foo; $q++; foo' 0
> >5.009005
> >42
> >
> >It looks like it, no?
> 
> I didnt want to say anything right away in the hope that Dave Mitchell
> would answer it, and in the knowledge i might have something wrong,
> but I seem to recall Dave explaining once in the past that perl trys
> to optimise allocation of memory so that it doesnt have to reallocate
> buffers every time a sub is entered. So basically storage for SV's is
> preserved between invocations when possible. But i dont remember the
> details and I just might be totally ass-backwards wrong.

Once upon a time there was talk of implementing a "less" pragma
so you'd be able to say something like

    use less qw(memory);

to indicate that cpu/memory balance should be shifted towards cpu.
Pity that never happened.

Tim.

Reply via email to