2011-04-23 15 views
5

Las direcciones de memoria para matrices anónimas son naturalmente reutilizadas por perl. Como muestra este ejemplo, que un ciclo entre dos direcciones para las matrices vacías:¿Por qué Perl reasigna la memoria siguiendo este patrón?

$ perl -E "say [] for (1..6)" 
ARRAY(0x37b23c) 
ARRAY(0x37b28c) 
ARRAY(0x37b23c) 
ARRAY(0x37b28c) 
ARRAY(0x37b23c) 
ARRAY(0x37b28c) 

me ocurrió con algunas teorías sobre por qué no podría reasignar la memoria inmediata, cuando me encontré con que el ciclo no es siempre dos direcciones largo. Los siguientes ciclos de ejemplos son 3 y 4.

$ perl -E "say [0] for (1..6)" 
ARRAY(0x39b23c) 
ARRAY(0x39b2ac) 
ARRAY(0x39b28c) 
ARRAY(0x39b23c) 
ARRAY(0x39b2ac) 
ARRAY(0x39b28c) 

$ perl -E "say [0,0] for (1..6)" 
ARRAY(0x64b23c) 
ARRAY(0x64b2cc) 
ARRAY(0x64b2ac) 
ARRAY(0x64b28c) 
ARRAY(0x64b23c) 
ARRAY(0x64b2cc) 

¿Cuál es la causa de esta peculiaridad de la gestión de la memoria?

+2

¿Por qué te importa? –

+0

@Jonathan, estoy implementando el cálculo de módulo;) Curiosidad. – Tim

+0

Debe leer 'perldoc perlguts' y unirse a la lista de correo de Perl Porters http://lists.perl.org/list/perl5-porters.html – shawnhcorey

Respuesta

2

Cuando se liberan SV, se colocan realmente en un grupo "libre". Quizás el orden en el que ingresan al grupo afecta el orden en que salen.

1

Dentro del conjunto de ejemplos que ha proporcionado, el número de direcciones no es "dos, o algunas veces más". Es "la cantidad de elementos en la matriz anónima, más dos". Como dijo ikegami, los SV entran en un grupo cuando son liberados, por lo que es de esperar que las direcciones cambien de algún modo, a menos que se haya hecho un esfuerzo deliberado para recuperarlos en orden aleatorio (lo que obviamente no se ha hecho) .

La pregunta restante, entonces, es por qué la duración del ciclo es "número de elementos + 2". Tal vez esté usando un SV para cada elemento de la matriz, uno para el arreglo en sí, y otro para $_?

Cuestiones relacionadas