2010-01-21 11 views

risposta

15

Preferiscono i tipi primitivi di passaggio (int, char, float, ...) e le strutture POD che sono economiche da copiare (Punto, complesso) in base al valore.

Questo sarà più efficiente rispetto all'indirizzamento richiesto quando si passa per riferimento.

Vedere Boost's Call Traits.

La classe template call_traits<T> incapsula il metodo "migliore" per passare un parametro di un certo tipo T o da una funzione, e consiste in una raccolta di typedefs definiti nella tabella seguente. Lo scopo di call_traits è quello di garantire che problemi come "riferimenti ai riferimenti" non si verifichino mai e che i parametri vengano trasmessi nel modo più efficiente possibile.

4

Sì, l'accesso a un argomento passato per riferimento potrebbe richiedere più livelli di riferimento indiretto rispetto a un argomento passato valore. Inoltre, potrebbe essere più lento se la dimensione dell'argomento è inferiore alla dimensione di un singolo puntatore. Ovviamente, tutto presuppone che il compilatore non lo stia ottimizzando.

+0

Quindi, come si può scoprire se il suo compilatore sta ottimizzando questo? – Arthur

+2

Osservando il codice binario –

7

È possibile leggere questo articolo "Want speed ? Pass by value" su copia elision e RVO (Return by Value Optimization). Spiega che i riferimenti a volte impediscono al compilatore di eseguirli.

1

Il compilatore può ottimizzare il passaggio di un tipo primitivo per riferimento al semplice passaggio per valore, se il tipo è della stessa dimensione o inferiore alla dimensione di un riferimento/puntatore. Non c'è alcuna garanzia che il compilatore lo farà, quindi se hai una scelta, passa i tipi primitivi per valore. Nel codice basato sul template, tuttavia, spesso si deve passare per riferimento - si consideri il push_back del vettore che prende un riferimento const. Se hai un vettore di interi, passeresti un riferimento a un tipo primitivo. In questa situazione, ci si aspetterebbe che il compilatore ottimizzasse questo sostituendo il riferimento con un valore. Dal momento che il vettore potrebbe memorizzare grandi tipi, accettare la referenza const è la scelta migliore.

+0

"Il compilatore potrebbe ottimizzare ..." fino a quando il destinatario non modifica il referend o lo legge dopo aver chiamato un codice che potrebbe modificarlo. Ma ovviamente nei casi in cui lo fa, si spera che non si ponga la domanda "che è più costoso", piuttosto "che è corretto" :-) Quelli imbarazzanti sono casi in cui si pensa che il compilatore possa ottimizzare, ma in realtà non è possibile perché hai trascurato alcune ragioni per cui deve essere un riferimento (le regole di aliasing sono la causa principale delle sorprese). –

Problemi correlati