Domanda

C'è un caso in cui pass-by-di riferimento è più costoso di passare per valore in C ++? Se così fosse, quale sarebbe questo caso essere?

È stato utile?

Soluzione

Preferisco passando tipi primitivi (int, char, float, ...) e le strutture POD che sono a buon mercato per copiare (Point, complessa) per valore.

Questo sarà più efficiente rispetto alla indiretto richiesto quando il passaggio per riferimento.

di Boost chiamata Tratti .

  

Il call_traits<T> classe template 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 i problemi come "i riferimenti ai riferimenti" non si verificano mai, e che i parametri sono passati nel modo più efficiente possibile.

Altri suggerimenti

È possibile leggere questo articolo "Vuoi velocità? passaggio per valore " sui copia elision e RVO (ritorno da value Optimization). Spiega che i riferimenti a volte impediscono il compilatore di fare loro.

Sì, l'accesso a un passato per argomento di riferimento potrebbe richiedere più livelli di indirezione di un passato per argomento value. Inoltre, è may essere più lento se la dimensione dell'argomento è minore della dimensione di un singolo puntatore. Naturalmente, è tutto supponendo che il compilatore non sta ottimizzando esso.

Il compilatore potrebbe ottimizzare il superamento di un tipo primitivo con riferimento semplicemente passare il valore, se il tipo è la stessa dimensione o inferiore alla dimensione di un riferimento / puntatore. Non c'è alcuna garanzia che il compilatore farà questo, quindi se avete una scelta, passare tipi primitivi per valore. Nel codice basato su modelli, però, spesso si devono passare per riferimento in ogni caso - considerare push_back del vettore che accetta un riferimento const. Se si dispone di un vettore di interi, devi essere il superamento di un riferimento a un tipo primitivo. In tale situazione, ci si spera il compilatore ottimizzare che sostituendo il riferimento con un valore. Poiché il vettore potrebbe essere memorizzando grandi tipi però, accettando un riferimento const è la scelta migliore.

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