2013-06-14 17 views

risposta

15

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.

+1

Grazie per una risposta molto istruttiva. Quali sviluppatori di D usano normalmente per i tipi di valore? – user763305

+1

@ 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. –

+0

Ma sicuramente gettare via "immutabile" da un carattere di 'stringa' è perfettamente a posto? –

1

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ò.

(Reference)

+0

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

+0

@yaz Concordato. In questo caso non stavo parlando dell'immutabile cast per const. –

13

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)

0

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.

Problemi correlati