in reply to Re^2: Freeing memory, revisited (Linux)
in thread Freeing memory, revisited (Linux)

Nice theory
Simply the truth.

In your run-time example, a different mechanism causes the allocations to be retained. Every sub-expression that returns a result has a "pad temp" allocated to it to store the temporary result. The values in the pad temp are retained until the sub is freed, but they are re-used. i.e. in the following:

sub f { return "x" x $_[0] } f(100_000); f(5); f(200_000);
a single temp will be stored within f's pad. On the first call it will hold a scalar of length 100_000, which gets retained. On the second call, the scalar is shrunk to length 5 (but not freed), and on the third call the scalar is realloced to grow to 200_000, and finally freed when the sub f is destroyed.

Dave.

Replies are listed 'Best First'.
Re^4: Freeing memory, revisited (Linux)
by Eliya (Vicar) on May 05, 2011 at 15:47 UTC
    Simply the truth.

    So if constant folding (+ allocation) and storing the results as part of the code happens at compile time, how would you explain that the (runtime-)prints in the strace output of the following snippet are interleaved with the allocations?

    {print STDERR "1"; "x" x 2**20} {print STDERR "2"; "x" x 2**20} {print STDERR "3"; "x" x 2**20}
    $ strace -e mmap,munmap,write ./903114.pl ... write(2, "1", 11) = 1 mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, - +1, 0) = 0x7fe6d7315000 write(2, "2", 12) = 1 mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, - +1, 0) = 0x7fe6d5e0f000 write(2, "3", 13) = 1 mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, - +1, 0) = 0x7fe6d5d0e000 munmap(0x7fe6d5d0e000, 1052672) = 0 munmap(0x7fe6d5e0f000, 1052672) = 0 munmap(0x7fe6d7315000, 1052672) = 0

    Also,

    $ perl -MO=Concise,-exec ./903114.pl ... 11 <$> const[PV "x"] s 12 <$> const[IV 1048576] s 13 <2> repeat[t9] vK/2 <--- ...

    seems to suggest that the repetition operator is applied at runtime.

      Ah, so repeat isn't constant folded. In which case, it's always the pad temps that retain the allocations.

      Dave.