in reply to perl5.10 Devel::Size behaviour changed?

I get:
>c:\progs\perl580\bin\perl test.pl SIZE : 268 >c:\progs\perl588\bin\perl test.pl SIZE : 268 >c:\progs\perl5100\bin\perl test.pl SIZE : 312

4.4 bytes per element.

Or I loop 100 times:

>c:\progs\perl580\bin\perl test.pl SIZE : 2156 >c:\progs\perl588\bin\perl test.pl SIZE : 2156 >c:\progs\perl5100\bin\perl test.pl SIZE : 2200

Still only 44 extra bytes. So they're tied to the array, not the elements. Adding Devel::Peek to the mix:

>c:\progs\perl588\bin\perl test.pl SIZE : 2156 SV = RV(0x185d34c) at 0x1820714 REFCNT = 1 FLAGS = (TEMP,ROK) RV = 0x236da4 SV = PVAV(0x23bfcc) at 0x236da4 REFCNT = 2 FLAGS = (PADBUSY,PADMY) IV = 0 NV = 0 ARRAY = 0x18799ac FILL = 99 MAX = 123 ARYLEN = 0x0 FLAGS = (REAL) >c:\progs\perl5100\bin\perl test.pl SIZE : 2200 SV = RV(0x1950668) at 0x195065c REFCNT = 1 FLAGS = (TEMP,ROK) RV = 0x1829944 SV = PVAV(0x23a120) at 0x1829944 REFCNT = 2 FLAGS = (PADMY,RMG) MAGIC = 0x1823f0c MG_VIRTUAL = &PL_vtbl_arylen_p MG_TYPE = PERL_MAGIC_arylen_p(@) MG_FLAGS = 0x02 REFCOUNTED ARRAY = 0x183502c FILL = 99 MAX = 123 ARYLEN = 0x0 FLAGS = (REAL)

I wonder why the array comes with magic attached!

Update: Added Devel::Peek dump.

Replies are listed 'Best First'.
Re^2: perl5.10 Devel::Size behaviour changed?
by ikegami (Patriarch) on Aug 25, 2009 at 14:10 UTC
    I couldn't leave it at that. It seems that Devel::Size actually modifies the array!
    >perl -MDevel::Size=total_size -MDevel::Peek -e"my @a; total_size(\@a) + if $ARGV[0]; Dump \@a,1" 0 SV = RV(0x239ba8) at 0x239b9c REFCNT = 1 FLAGS = (TEMP,ROK) RV = 0x1829954 SV = PVAV(0x23aa60) at 0x1829954 REFCNT = 2 FLAGS = (PADMY) ARRAY = 0x0 FILL = -1 MAX = -1 ARYLEN = 0x0 FLAGS = (REAL) >perl -MDevel::Size=total_size -MDevel::Peek -e"my @a; total_size(\@a) + if $ARGV[0]; Dump \@a,1" 1 SV = RV(0x239ba8) at 0x239b9c REFCNT = 1 FLAGS = (TEMP,ROK) RV = 0x1829954 SV = PVAV(0x23aa60) at 0x1829954 REFCNT = 2 FLAGS = (PADMY,RMG) MAGIC = 0x1824014 MG_VIRTUAL = &PL_vtbl_arylen_p MG_TYPE = PERL_MAGIC_arylen_p(@) MG_FLAGS = 0x02 REFCOUNTED ARRAY = 0x0 FILL = -1 MAX = -1 ARYLEN = 0x0 FLAGS = (REAL)

    It's similar but different than using $#a:

    >perl -MDevel::Size=total_size -MDevel::Peek -e"my @a; $#a if $ARGV[0] +; Dump \@a,1" 0 SV = RV(0x239260) at 0x239254 REFCNT = 1 FLAGS = (TEMP,ROK) RV = 0x182991c SV = PVAV(0x23a168) at 0x182991c REFCNT = 2 FLAGS = (PADMY) ARRAY = 0x0 FILL = -1 MAX = -1 ARYLEN = 0x0 FLAGS = (REAL) >perl -MDevel::Size=total_size -MDevel::Peek -e"my @a; $#a if $ARGV[0] +; Dump \@a,1" 1 SV = RV(0x239340) at 0x239334 REFCNT = 1 FLAGS = (TEMP,ROK) RV = 0x182991c SV = PVAV(0x23a168) at 0x182991c REFCNT = 2 FLAGS = (PADMY,RMG) MAGIC = 0x1823de4 MG_VIRTUAL = &PL_vtbl_arylen_p MG_TYPE = PERL_MAGIC_arylen_p(@) MG_FLAGS = 0x02 REFCOUNTED MG_OBJ = 0x239254 SV = PVMG(0x18fb364) at 0x239254 REFCNT = 1 FLAGS = (GMG,SMG) IV = 0 NV = 0 PV = 0 MAGIC = 0x1823f0c MG_VIRTUAL = &PL_vtbl_arylen MG_TYPE = PERL_MAGIC_arylen(#) MG_OBJ = 0x182991c ARRAY = 0x0 FILL = -1 MAX = -1 ARYLEN = 0x239254 FLAGS = (REAL)

        If it's a bug, it's not attributable to Devel::Size. Any operation that queries the size does the same thing:

        perl -MDevel::Peek -e "my @a; Dump \@a, 1; printf qq[SIZE :%d\n], $#a; + Dump \@a, 1" SV = RV(0x34e158) at 0x34e148 REFCNT = 1 FLAGS = (TEMP,ROK) RV = 0x276630 SV = PVAV(0x34efb8) at 0x276630 REFCNT = 2 FLAGS = (PADMY) ARRAY = 0x0 FILL = -1 MAX = -1 ARYLEN = 0x0 FLAGS = (REAL) SIZE :-1 SV = RV(0x34e290) at 0x34e280 REFCNT = 1 FLAGS = (TEMP,ROK) RV = 0x276630 SV = PVAV(0x34efb8) at 0x276630 REFCNT = 2 FLAGS = (PADMY,RMG) MAGIC = 0x27fde8 MG_VIRTUAL = &PL_vtbl_arylen_p MG_TYPE = PERL_MAGIC_arylen_p(@) MG_FLAGS = 0x02 REFCOUNTED MG_OBJ = 0x34e148 SV = PVMG(0x261f18) at 0x34e148 REFCNT = 1 FLAGS = (GMG,SMG,pIOK) IV = -1 NV = 0 PV = 0 MAGIC = 0x27fcf8 MG_VIRTUAL = &PL_vtbl_arylen MG_TYPE = PERL_MAGIC_arylen(#) MG_OBJ = 0x276630 ARRAY = 0x0 FILL = -1 MAX = -1 ARYLEN = 0x34e148 FLAGS = (REAL)

        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.