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
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 diperl
. È possibile guardare l'outputperl -V
per visualizzare le dimensioni di vari tipi di dati. Hoivsize=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
oPVNV
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.
- 1. Come posso inizializzare automaticamente tutte le variabili scalari in Perl?
- 2. Come si eseguono jQuery promises in phantomJS?
- 3. Come si inizializzano le variabili in Ruby?
- 4. Come si eseguono test continui in .NET?
- 5. Come si eseguono operazioni bit in glsl
- 6. Come si eseguono assegnazioni multiple in MATLAB?
- 7. Come si eseguono i test in Sinatra?
- 8. Impostazione di due variabili scalari in una istruzione SELECT?
- 9. Come si eseguono le corrispondenze di caratteri jolly con XSLT?
- 10. Come si eseguono le specifiche di una gemma Ruby?
- 11. Numpy converte scalari in matrici
- 12. Come si eseguono più script grunt scripts.post?
- 13. Come si eseguono i test delle meteore?
- 14. Come si eseguono programmi con Strawberry Perl?
- 15. Come posso cambiare la faccia delle variabili scalari in emacs cperl-mode?
- 16. Indirizzo di memoria delle variabili in Java
- 17. rifiuti in allocazione di memoria per le variabili locali
- 18. SQLAlchemy e valori scalari
- 19. Come si eseguono le migrazioni del database Django quando si utilizza Docker-Compose?
- 20. Come si usano le variabili booleane in Perl?
- 21. Come si "combinano le variabili" in JavaScript per soddisfare JSLint?
- 22. Come si usano le variabili di classe in Clamato?
- 23. Come si elencano solo le variabili create dall'utente in PowerShell?
- 24. Come si eseguono più istruzioni in Web SQL?
- 25. Come si eseguono più attività Rake in modo programmatico contemporaneamente?
- 26. Come si eseguono gli script Python in modo persistente?
- 27. Come si eseguono più test case Python in un ciclo?
- 28. Come si eseguono comandi shell MULTIPLE in un'attività gruntjs?
- 29. Come si eseguono script Lua su Android in un'applicazione Java?
- 30. Come si eseguono Python 2 e 3 in Windows 7?