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