Domanda

Perché gli rvalue non hanno un indirizzo di memoria?Non vengono caricati nella RAM durante l'esecuzione del programma o si riferiscono ai valori memorizzati nei registri del processore?

È stato utile?

Soluzione

La tua domanda ("Perché i valori non hanno un indirizzo di memoria?") è un po' confusa.Un valore è un tipo di espressione. Espressioni non hanno indirizzi: oggetti avere indirizzi.Sarebbe più corretto chiedersi "perché non si può applicare l'operatore indirizzo di un'espressione rvalue?"

La risposta è piuttosto semplice:puoi prendere solo l'indirizzo di un oggetto e non tutte le espressioni rvalue si riferiscono a oggetti (ad esempio, l'espressione 42 ha un valore ma non si riferisce a un oggetto).

Alcune espressioni di valore si riferiscono a oggetti, ma tali oggetti mancano di persistenza.Un oggetto a cui fa riferimento un'espressione rvalue è a temporaneo oggetto e viene distrutto alla fine dell'espressione in cui è creato.Tali oggetti hanno effettivamente indirizzi (puoi scoprirlo facilmente chiamando una funzione membro su un oggetto temporaneo;IL this il puntatore deve puntare all'oggetto temporaneo e quindi l'oggetto temporaneo deve avere un indirizzo).

Questa è la differenza fondamentale tra le espressioni lvalue e le espressioni rvalue.Le espressioni Lvalue si riferiscono a oggetti che hanno persistenza:l'oggetto a cui si riferisce un'espressione lvalue persiste oltre una singola espressione.

Altri suggerimenti

Pensa a rvalue COME valore di un espressione.IL valore in sé non ha indirizzo.Ma il oggetti coinvolgere nell'espressione avere indirizzo.Puoi prendere l'indirizzo di un oggetto, anche se si tratta di un oggetto temporaneo.

Considera questo,

const int & i = 10; //ok

Qui, 10 è un valore, quindi appare Quello &i è un indirizzo del 10.No, è sbagliato. &i è un indirizzo di l'oggetto temporaneo di tipo int, che viene creato dall'espressione 10.E poiché l'oggetto temporaneo non può essere associato a un riferimento non const, utilizzo const.Ciò significa che quanto segue è un errore:

int & i = 10; //error

La questione mescola due diversi aspetti legati alla “specifica” e all'”implementazione”.

Le "specifiche" definiscono alcune regole astratte che definiscono come il linguaggio si comporta rispetto ad una macchina astratta con cui funziona.Adattare quella "macchina astratta" a "quella reale" è uno scopo del compilatore (non del linguaggio).

Ciò che la specifica impone è che, secondo il punto di vista del linguaggio, una "memoria" (un pezzo di memoria con un indirizzo appropriato) viene assegnata solo agli oggetti che hanno un nome (per l'esistenza dello scope che il nome vive) o che vengono allocati dinamicamente con una richiesta esplicita (new).Tutto il resto è "temporaneo":assegna, copia e si sposta come un oggetto, ma non lo è necessario per esistere in un luogo ben definito e stabile.Almeno non per quanto riguarda la lingua.

Naturalmente, questo deve rimanere (fisicamente) da qualche parte, quindi puoi, con un casting o una conversione appropriati, provare a indovinare un indirizzo di memoria.Ma le specifiche della lingua non garantiscono alcun comportamento coerente se si tenta di utilizzarla attivamente.Ciò significa che diversi compilatori possono comportarsi diversamente e ottimizzare al meglio rispetto alla macchina reale a cui si rivolgono.

Cosa vuoi dire con i valori che hanno un indirizzo.Mai provato

Type const value& = rvalue;
Type const* address = &value;

Prendi semplicemente questo caso

int a = 1 + 2;

1+2 si risolve in 3.

Chiedilo a te stesso:

  • 3 è un oggetto?
  • Dove si troverebbero 3 nella memoria?

Quando hai bisogno dell'indirizzo di un oggetto, usi &.

Se rvalues ​​fosse indirizzabile, significa che potresti dichiarare un puntatore al punto in cui il tuo computer ha deciso di memorizzare 3

int* a = &3;

Ti sembra giusto?:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top