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 ); 
}
È stato utile?

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

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