2013-10-11 16 views
7

In altre lingue oltre a Perl quando si dichiara un numero intero ha valori minimi e massimi in base alla quantità di spazio nella memoria occupata dalla variabile. Quando si dichiara una variabile scalare in Perl, che si tratti di un numero o di una stringa, la lingua assegna solo una quantità sufficiente per il valore della variabile e quindi aumenta lo spazio se necessario in seguito o Perl alloca inizialmente una grande quantità di memoria?Come si eseguono le variabili scalari in memoria?

risposta

8

In Perl, una variabile scalare è un puntatore a una struttura C denominata SV. Ciò include vari campi per i metadati come il conteggio dei riferimenti, un campo bit che determina il tipo esatto e un puntatore a dati (meta-) aggiuntivi.

  • Se si utilizza uno scalare come un intero, si parla di IV e contiene un numero intero. La dimensione di questo intero è fissata alla compilazione di perl. È possibile guardare l'output perl -V per visualizzare le dimensioni di vari tipi di dati. Ho ivsize=8. I valori rappresentabili sono gli stessi del numero intero C di quella dimensione.

  • Se si utilizza uno scalare come decimale, viene chiamato NV (valore numerico) e contiene un doppio, di solito. Ancora una volta, la dimensione esatta è determinata al momento della compilazione.

  • Se si utilizza uno scalare come stringa, viene chiamato PV e contiene un puntatore a una stringa C, più alcuni metadati aggiuntivi come la lunghezza. La stringa C viene riallocata se cresce.

  • Se si utilizza uno scalare come stringa e come numero, è PVIV o PVNV risp. e include i dati di entrambi i tipi.

  • Ci sono altri tipi come riferimenti (RV) o interi senza segno (UV).

Per la IV e NV, Perl non favorisce automaticamente i numeri per bignum quando crescono abbastanza grande.

Quindi ci sono gli hash HV e gli array AV. Questi usano l'intestazione SV per cose come il conteggio dei riferimenti ma puntano a strutture dati più complicate.

  • array contengono una matrice C di puntatori a SV s. Se l'array cresce, viene riallocato.

  • Gli hash sono molto più complessi. Fondamentalmente, sono anche un array, ma contengono voci di hash invece di SV s. Gli elementi di questo hash sono chiamati bucket. Se il rapporto entrate/uscite è troppo alto, l'array viene riallocato (di solito a dimensione doppia) e le voci vengono distribuite di nuovo tra questi bucket. Questo non è strettamente necessario, ma in caso contrario, la ricerca è O(n) anziché O(1) (ovvero lento).


  • strutture di dati di dimensioni variabili come stringhe, array, hash vengono inizialmente assegnate conservativo. Se è richiesto più spazio, viene allocata una porzione di memoria più grande e i dati vengono copiati.

  • Gli scalari hanno un'intestazione di dimensioni costanti. Memoria addizionale per metadati aggiuntivi viene allocata quando il tipo cambia (ad esempio attraverso la stringa).

Per ulteriori informazioni e diagrammi di puntatori confusi leggere lo Illustrated Perl Guts.

Problemi correlati