Perché non è garantito l'utilizzo di Int type
di GHC con esattamente 32 bit di precisione? This document claim ha almeno Precisione firmata a 30 bit. È in qualche modo correlato al raccordo Maybe Int
o simile in 32-bit?Dimensione bit di GHC's Int Type
risposta
È per consentire implementazioni di Haskell che utilizzano la codifica. Quando usi il tagging hai bisogno di alcuni bit come tag (almeno uno, due è meglio). Non sono sicuro che al momento ci siano tali implementazioni, ma mi sembra di ricordare che Yale Haskell l'abbia usato.
L'etichettatura può in qualche modo evitare gli svantaggi del pugilato, dal momento che non è più necessario impacchettare tutto; invece il tag bit ti dirà se è valutato ecc.
Potresti spiegare" tagging "e" boxing "? –
Penso che questo sia dovuto ai primi modi di implementare GC e tutto il resto. Se disponi di 32 bit e ne hai solo 30, puoi utilizzare questi due bit di riserva per implementare cose interessanti, ad esempio utilizzando uno zero nel bit meno significativo per indicare un valore e uno per un puntatore.
Oggi le implementazioni non utilizzano quei bit in modo che uno Int
abbia almeno 32 bit su GHC. (Non è del tutto vero. IIRC si possono impostare alcune bandiere per avere 30 o 31 bit Int
s)
La definizione del linguaggio Haskell afferma che lo type Int
covers at least the range [−229, 229−1]. Esistono altri compilatori/interpreti che utilizzano questa proprietà per aumentare il tempo di esecuzione del programma risultante.
Tutti i riferimenti interni ai dati Haskell (allineati) puntano a indirizzi di memoria multipli di 4 (8) su sistemi a 32 bit (64 bit). Quindi, i riferimenti hanno bisogno solo di 30 bit (61 bit) e quindi consentono 2 (3) bit per "puntatore" "".
In caso di dati, il GHC utilizza tali tag per memorizzare informazioni su tali dati di riferimento, vale a dire se tale valore è già stato valutato e, in caso affermativo, quale costruttore ha.
In caso di 30-bit Int
s (così, non GHC), si potrebbe usare un po 'per decidere se è o un puntatore ad un non valutata Int
o che si Int
.
È possibile utilizzare la codifica del puntatore per conteggio di riferimento a un bit, che può accelerare il processo di garbage collection. Ciò può essere utile nei casi in cui una relazione one-to-one tra produttore e consumatore è stata creata in fase di esecuzione: risulterebbe direttamente nel riutilizzo della memoria invece che nell'alimentazione di un garbage collector.
Quindi, utilizzando 2 bit per l'indicatore del tagging, ci potrebbe essere una combinazione selvaggia di ottimizzazione intensa ... In caso di Ints potevo immaginare questi 4 tags:
- singolare riferimento a un non valutata
Int
- uno dei molti riferimenti agli stessi eventualmente ancora non valutata
Int
- 30 bit di tale
Int
stessa - riferimento (di molti possibili riferimenti a) una valutazione di 32 bit
Int
.
- 1. La dimensione del carattere * è uguale alla dimensione di int *?
- 2. Hash 32 bit int a 16 bit int?
- 3. $ dimensione, $ bit, verilog
- 4. Utilizzo di bit con int nella struttura
- 5. Numero bit/dimensione byte dell'array
- 6. Puntatore C++ di dimensione bit specifica
- 7. La dimensione di (enum) == sizeof (int), sempre?
- 8. Converti 12 bit int a 16 o 32 bit
- 9. Come convertire l'int firmato a 32 bit int a 32 bit senza segno int?
- 10. int vs size_t su 64 bit
- 11. È un Java int sempre 32 bit?
- 12. Qual è la dimensione del bit di long su Windows a 64 bit?
- 13. Prefisso dimensione operando in modalità 16 bit
- 14. Vettore di doppio bit più veloce a 64 bit rispetto a un vettore di int non firmato a 32 bit?
- 15. È int in C Sempre a 32 bit?
- 16. Objective C - Type Casting Da NSString verso Int
- 17. Come reinterpretare i bit di un float come int
- 18. Come ottengo gli 8 bit inferiori di int?
- 19. come convertire un int in una maschera di bit?
- 20. C++ - Bit-wise non di uchar produce int
- 21. Rappresenta un elenco di enum a bit come Int
- 22. Bit bit shifting e scartare bit
- 23. Long type 64bit linux
- 24. Qual è la dimensione massima di int (10) in Mysql
- 25. Qual è la dimensione di un SQL Int (N)?
- 26. Definizione della dimensione di un array utilizzando un const int
- 27. Dimensioni di memoria di un sistema Java a 32 bit int [] array
- 28. SQL Server: varbinary o int per memorizzare una maschera bit?
- 29. Il modo migliore per convertire INT in BIT
- 30. Stringa esadecimale a 16 bit con firma int in Java
Ci saranno altri con maggiori dettagli, ma penso che abbia a che fare con la raccolta dei rifiuti e la pigrizia.Un po 'per "è valutato", un po' per copiato da GC. Non sicuro al 100%. – luqui
Se è necessario avere 32 bit garantiti, c'è il tipo 'Int32' in' Data.Int'. – hammar
Non c'è limite superiore perché dipende dalla piattaforma: sulla macchina 64x 'Prelude.maxBound :: Int' dovrebbe essere intorno a 2^63 –