Copia costruttore vs ottimizzazione valore di ritorno
-
21-08-2019 - |
Domanda
In un precedente domanda , è emerso che una funzione semplice ritorno per valore sempre copie suo argomento return
nella variabile viene assegnato da esso.
Questo è richiesto dalla norma, o la funzione può essere ottimizzato con la costruzione del 'assegnato a' variabile anche all'interno del corpo della funzione?
struct C { int i; double d; };
C f( int i, int d ) {
return C(i,d); // construct _and_ copy-construct?
}
int main() {
C c = f( 1, 2 );
}
Soluzione
Lo standard consente a qualsiasi livello di copia omissione qui:
- costruire una temporanea locale, copia-costruirlo in un valore di ritorno, e copia-costruire il valore di ritorno nella "c" locale. o
- costruzione di una temporanea locale, e copia-costrutto che in "c". o
- costruire "c" con gli argomenti "i, d"
Altri suggerimenti
Lo standard dice che il costruttore di copia non deve essere usato - vedi sezione 12.8 / 15:
15 Ogni volta che un oggetto di classe temporanea viene copiato usando un costruttore di copia, e questo oggetto e la copia hanno il stesso cv-qualificato tipo, un implementazione è autorizzato a trattare l'originale e la copia come due diversi modi di riferirsi al stesso oggetto e non eseguire una copia a tutti, anche se la copia di classe costruttore o distruttore hanno lato effetti.
E molto altro ancora in un modo simile.
Way non passa parametro per riferimento e assegnare risultato ad esso?
C'è un modo molto semplice e buona per evitare completamente tali considerazioni - si può considerare la restituzione di un boost :: shared_ptr per l'oggetto creato - sarà praticamente lo stesso quando si tratta di usabilità, ma l'oggetto non sarà sicuramente copiato inutilmente -. e sarà vero anche se si torna, però un paio di strati di chiamate di funzione