A cosa servono i riferimenti a valore R?

5

Sto cercando di approfondire il C ++ e di imparare davvero le sfumature del linguaggio, ma una cosa che ho trovato davvero confusa è il riferimento R-Value. Tutta la doppia e commerciale cosa per essere chiari (nel caso in cui abbia sbagliato la terminologia). Non è un grosso problema in quanto non sembra emergere spesso, ma sembra che a volte potrebbe essere utile sapere.

    
posta Keltek 09.10.2015 - 06:08
fonte

3 risposte

8

Un caso d'uso comune è il "costruttore di mosse", invocato quando un oggetto viene copiato da un temporaneo che sta per scadere (un rvalore). Un esempio è foo = bar + baz; dove bar + baz è un temporaneo sul lato destro di un'istruzione di assegnazione.

Prima dei riferimenti al valore di riferimento, gli oggetti che facevano copie profonde del loro contenuto dovevano costruire i loro dati in un posto, quindi copiarli tutti su un altro, quindi distruggere la prima copia. Questo è stato lento e dispendioso.

Quando la sorgente è un riferimento di valore, il costruttore di movimento o l'operatore di assegnamento tipicamente eseguirà una copia superficiale dei dati della sorgente, quindi rimuoverà i riferimenti della sorgente in modo che sia una shell vuota quando viene cancellata un momento dopo e i dati ora avrà un nuovo proprietario. Questo è sicuro, perché un riferimento di rvalue non sarà usato per nient'altro prima che sia distrutto, molto più veloce, e salva la memoria.

    
risposta data 09.10.2015 - 07:46
fonte
3

lvalue: un valore che risiede in memoria (heap o stack) e indirizzabile.

rvalue: un valore che non è lvalue.

Si trova solo sul lato destro di un'espressione di assegnazione, ad esempio un valore letterale o un carattere temporaneo che è destinato a essere non modificabile.

ecco un ottimo tutorial a riguardo:

link

    
risposta data 09.10.2015 - 07:03
fonte
1

Anch'io ho trovato questo molto difficile da capire in un primo momento. Se pensi ai valori r come temporanei, le istanze senza nome aiuta. Ad esempio

functionCall( SomeObject{ 0 } );

In questo caso

SomeObject{ 0 }

è una chiamata al costruttore che crea un'istanza temporanea, senza nome, della classe SomeObject. Se fai la firma di

functionCall( SomeObject&& x )

quindi accetta solo oggetti temporanei senza nome.

Ora, una volta compreso questo, è necessario rendersi conto che un oggetto non temporaneo denominato può essere convertito in un valore R automaticamente dal compilatore o esplicitamente dal programmatore (std :: move).

Se sposti un oggetto con nome std::move( x ) allora x non può più essere utilizzato perché è "matto" (memoria) spostato.

L'uso principale per i valori r come funzionalità del linguaggio è quello di spostare gli oggetti dentro e fuori le funzioni senza copiare.

    
risposta data 11.10.2015 - 03:46
fonte

Leggi altre domande sui tag