2009-03-20 23 views
6

In un previous question, è apparso che una semplice funzione di ritorno al valore copia sempre il suo argomento return nella variabile che gli viene assegnata.Copia costruttore vs ottimizzazione del valore di ritorno

È richiesto dallo standard oppure la funzione può essere ottimizzata costruendo la variabile 'assegnata a' 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); 
} 

risposta

7

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
  • costruire un temporaneo locale e copiarlo in "c". O
  • costrutto "c" con gli argomenti "Io, d"
+0

Potresti fornire il numero di sezione dello standard per favore? –

+0

Lo stesso che Neil ha pubblicato: 12.15. Lo interpreti diversamente? –

7

La norma 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 con un costruttore di copia, e questo oggetto e la copia ha lo stesso tipo cv-non qualificato, un'implementazione è consentita per trattare l' l'originale e la copia come due diversi modi di riferirsi allo stesso oggetto e non eseguire una copia allo tutto, anche se la copia della classe costruttore o distruttore ha effetti laterali .

E molto altro ancora.

+0

12.5 nel mio standard del 1998 è "Negozio gratuito" si fa riferimento ad altri standard? –

+0

Dovrebbe essere il 12.8/15 –

-1

C'è un modo molto semplice e buona per evitare completamente tali considerazioni - si può considerare la restituzione di un boost :: shared_ptr all'oggetto creato - sarà praticamente lo stesso per quanto riguarda l'usabilità, ma il tuo oggetto non verrà sicuramente copiato inutilmente - e sarà vero anche se lo restituirai attraverso un paio di livelli di chiamate di funzione.

+0

non è un bene per shared_ptr std :: string o std :: pair o std :: vector. –

+0

Per evitare la costruzione della copia, potrei usare l'heap i.s.o. stoccaggio dello stack. Lo so:)/ Ma volevo sapere se posso fidarmi del compilatore, cioè lo standard di _guarantee_ che chiama il mio costruttore di copie. Quale non posso. – xtofl

+0

curioso: perché hai bisogno comunque di questa garanzia xtof? –

0

Way non passa il parametro per riferimento e assegna il risultato ad esso?

+0

perché è più brutto e meno flessibile nel sito di chiamata. dovrebbe essere fatto solo in punti critici per le prestazioni. –

+0

Oppure quando sono necessari più valori di ritorno (uno stato e un valore per esempio) – xtofl

Problemi correlati