Esiste un caso in cui il pass-by-reference è più costoso del pass-by-value in C++? In tal caso, quale sarebbe il caso?Passaggio per riferimento più costoso del passaggio per valore
risposta
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 dicall_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.
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.
È 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.
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.
"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). –
- 1. Obiettivo C - Passaggio per valore e passaggio per riferimento
- 2. Passaggio per valore o riferimento const?
- 3. Passaggio per valore/riferimento, che cosa?
- 4. Passaggio rapido struttura per riferimento?
- 5. Passaggio per riferimento in C
- 6. Passaggio di container per valore o per riferimento
- 7. ciò che è diverso tra il passaggio per valore e il passaggio per riferimento utilizzando C#
- 8. Passaggio di aggiornamento Golang per il valore di riferimento
- 9. Passaggio per "Valore di riferimento"? Alcuni chiarimenti necessari
- 10. Comprendere il passaggio per riferimento e valore con le funzioni
- 11. ricorsione e il passaggio per riferimento
- 12. Bash - Passaggio di argomenti per riferimento
- 13. Passaggio per opzioni di riferimento in C++
- 14. Passaggio di riferimento?
- 15. Passaggio per valore o rvalue-ref
- 16. passaggio Java con riferimento
- 17. Passaggio per riferimento costante nella lista di cattura lambda
- 18. PowerShell passaggio per riferimento non funzionante per me
- 19. passaggio del valore all'annotazione personalizzata in java
- 20. R: il passaggio di un frame di dati per riferimento
- 21. Una linea guida generale per il passaggio dei parametri del metodo per riferimento o per valore (C#)?
- 22. passaggio di vettori a una funzione, valore vs riferimento C++
- 23. Il passaggio per riferimento evita sempre il problema dell'affettatura?
- 24. Regexp per rilevare il passaggio del tempo di chiamata per riferimento nel codice sorgente PHP
- 25. PHP: call_user_func_array: passaggio dal problema riferimento
- 26. R, copie profonde o superficiali, passaggio per riferimento
- 27. Passaggio PHP per riferimento in funzione ricorsiva non funzionante
- 28. Perché il passaggio per riferimento coinvolge un costruttore di copie?
- 29. Passaggio membro della classe di classe base costruttore (per riferimento)
- 30. Casella di testo 'popup' visualizzata al passaggio del mouse/passaggio del mouse per CSS/Javascript
Quindi, come si può scoprire se il suo compilatore sta ottimizzando questo? – Arthur
Osservando il codice binario –