Qual è la differenza tra i qualificatori di tipo const
e immutable
in D?Qual è la differenza tra const e immutable in D?
risposta
Qualcosa che è const
non può essere mutato tramite quel riferimento ma potrebbe essere modificato da un riferimento mutevole agli stessi dati. Qualcosa che è immutable
non può essere mutato da qualsiasi riferimento a tali dati. Quindi, se avete
const C c = foo();
poi si sa che non si può mutare l'oggetto a cui si riferisce c
attraverso c
, ma altri riferimenti all'oggetto a cui si riferisce c
possono esistere nel codice, e se sono mutabili , potrebbero mutarlo e quindi cambiare ciò che vede c
. Ma se avete
immutable C c = foo();
poi si sa che non è possibile per l'oggetto a cui si riferisce c
a cambiare. Una volta che un oggetto immutable
è stato costruito, è illegale che sia mutato e, a meno che non si sovverta il sistema di tipi tramite casting, non è nemmeno possibile avere un riferimento mutabile a un oggetto immutable
. E dal momento che gli oggetti immutable
possono essere messi in memoria di sola lettura se il compilatore sceglie, si potrebbero effettivamente ottenere segfaults e simili se si è tentato di scartare lo immutable
e di mutare l'oggetto. Lo stesso vale per const
, poiché un riferimento const
potrebbe effettivamente fare riferimento a un oggetto immutable
. Lanciare via const
o immutable
e quindi mutare l'oggetto allora mutabile è un comportamento indefinito e in pratica non dovrebbe mai essere fatto.
E dal momento che un oggetto immutable
non può mai essere mutato anche da un altro riferimento, la lettura di un oggetto immutable
da più thread è completamente thread-safe. Pertanto, gli oggetti immutable
vengono condivisi implicitamente attraverso i thread, mentre tutto il resto che non è esplicitamente contrassegnato con shared
è considerato thread-local. immutable
offre inoltre migliori opportunità di ottimizzazione per il compilatore rispetto a const
, poiché è garantito che non cambi mai, mentre un oggetto const
può cambiare tramite un altro riferimento agli stessi dati.
Per i tipi di valore, non c'è davvero molta differenza tra const
e immutable
(dal momento che non si può avere riferimenti mutevoli per i tipi di valore non mutabili), ma per i tipi di riferimento, c'è una differenza significativa.
Grazie per una risposta molto istruttiva. Quali sviluppatori di D usano normalmente per i tipi di valore? – user763305
@ user763305 Al momento, non riesco a pensare ad alcun motivo tecnico per preferire uno rispetto all'altro, e non so cosa lo sviluppatore D medio scelga di usare. Personalmente, scelgo "immutabile", perché allora è chiaro che non può essere mutato senza dover sapere che è un tipo di valore, ma è solo una preferenza personale. –
Ma sicuramente gettare via "immutabile" da un carattere di 'stringa' è perfettamente a posto? –
Essi sono differenti nel senso che dati immutable
, potrebbe effettivamente collocati in sezioni di sola lettura di memoria, e quindi, qualsiasi tentativo di modificare i dati che si sicuro.
Qualcosa dichiarato const
(e non immutabile) dall'altro esiste nella/sezione w r e il valore può ancora essere modificato attraverso un riferimento non const diverso ad esso.
Quindi, "const-ness" può essere scavalcato in tal caso, mentre l'immutabilità non può.
Questo non è completamente corretto in quanto i dati 'const' possono essere effettivamente" immutabili "in origine. Quindi i dati 'const' possono anche essere in sezioni di sola lettura come dati immutabili' casualmente in 'const'. – yaz
@yaz Concordato. In questo caso non stavo parlando dell'immutabile cast per const. –
Quando si dichiara qualcosa come const
, vi prometto che non sarà modificarlo. Quando qualcosa viene dichiarato come immutable
, ti viene promesso che non verrà modificato da qualche altra parte (e naturalmente, non puoi modificarlo)
Una variabile dichiarata di tipo const
può accettare un valore mutabile o un valore immutabile. Questa definizione è rilevante per i tipi di riferimento come matrici e oggetti o puntatori. In genere verrebbe utilizzato per argomenti di funzione. Quindi in D const è un tipo di attributo di caratteri jolly per valori mutabili e immutabili.
Non ha molto senso per i valori copiati con un compito come char, int o float.
Il concetto di const e immutable è molto diverso da quello trovato in C e C++. Ero molto confuso da questo.
- 1. Qual è la differenza tra const const e const?
- 2. Qual è la differenza tra% i e% d in Python?
- 3. Qual è la differenza tra printf ("% i") e printf ("% d")
- 4. Qual è la differenza tra Const e Constant?
- 5. Qual è la differenza tra "const" e "val"?
- 6. Qual è la differenza tra% d e% * d in linguaggio c?
- 7. Qual è la differenza tra dict() e {}?
- 8. qual è la differenza tra import e const e quale è preferito in commonjs
- 9. Differenza tra "\\ d +" e "\\ d ++" in java regex
- 10. Qual è la differenza tra una funzione membro const e una funzione membro non const?
- 11. Qual è la differenza tra "std :: string const & s" e "const std :: string & s"?
- 12. react-redux: Qual è la differenza tra state.setIn() e state.set()?
- 13. Qual è la differenza tra logicalDpiX e physicalDpiX in Qt?
- 14. Qual è la differenza tra = e: =
- 15. Qual è la differenza tra `##` e `hashCode`?
- 16. qual è la differenza tra:.! e: r !?
- 17. Qual è la differenza tra Verilog! e ~?
- 18. Qual è la differenza tra ("") e (null)
- 19. Qual è la differenza tra appiattire e ravel in numpy?
- 20. Qual è la differenza tra? : e ||
- 21. qual è la differenza tra [[], []] e [[]] * 2
- 22. Qual è la differenza tra $ e $$?
- 23. Qual è la differenza tra " " e ""?
- 24. Qual è la differenza tra {0} e ""?
- 25. Qual è la differenza tra {0} e +?
- 26. Qual è la differenza tra .ToString() e + ""
- 27. In D, qual è la differenza tra un'importazione privata e un'importazione normale?
- 28. Qual è la differenza tra const, readonly e ottenere in una classe statica
- 29. Qual è la differenza tra variabili immutabili e const in Rust?
- 30. Qual è la differenza tra `ImmutableSortedSet` e fsharp` Set`?
È possibile leggere l'immutabilità su questo collegamento http://ddili.org/ders/d.en/const_and_immutable.html – yaz