Bueno, undef
se supone que es un valor de peso mosca, lo que significa que todas las referencias a él apuntan a t el mismo dato No lo entiendes por otros literales. Aún necesita la sobrecarga de la ranura que lo hace referencia. Sin embargo, no veo que guarde ningún recuerdo para mí en Perl 5.10 o 5.11 en Mac OS X. Si bien perl
puede no estar usando más memoria en el caso undef
, apuesto a que está anticipando el uso de más memoria para que lo agarre de todos modos. Sin embargo, no estoy interesado en investigar el uso de la memoria en el interior ahora mismo.
Devel::Peek es bastante práctico para mostrar este tipo de cosas:
#!perl
use Devel::Peek;
my $a = undef;
my $b = undef;
Dump($a);
Dump($b);
my %hash = map { $_, undef } 1 .. 3;
$hash{4} = 'Hello';
Dump(\%hash);
La salida se ve un poco de miedo al principio, pero se ve que el undef
valores son NULL(0x0)
en lugar de los valores de cadena individuales (PV
):
SV = NULL(0x0) at 0x100208708
REFCNT = 1
FLAGS = (PADMY)
SV = NULL(0x0) at 0x100208738
REFCNT = 1
FLAGS = (PADMY)
SV = RV(0x100805018) at 0x100805008
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x100208780
SV = PVHV(0x100809ed8) at 0x100208780
REFCNT = 2
FLAGS = (PADMY,SHAREKEYS)
ARRAY = 0x100202200 (0:5, 1:2, 2:1)
hash quality = 91.7%
KEYS = 4
FILL = 3
MAX = 7
RITER = -1
EITER = 0x0
Elt "4" HASH = 0xb803eff9
SV = PV(0x100801c78) at 0x100804ed0
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x100202a30 "Hello"\0
CUR = 5
LEN = 8
Elt "1" HASH = 0x806b80c9
SV = NULL(0x0) at 0x100820db0
REFCNT = 1
FLAGS =()
Elt "3" HASH = 0xa400c7f3
SV = NULL(0x0) at 0x100820df8
REFCNT = 1
FLAGS =()
¿Tiene problemas de memoria o solo tiene curiosidad? –
Curioso. Como veo, el cambio difícilmente puede ahorrar una notable cantidad de ram. –