vectores valor referencia por paso pasar parametros matriz funciones ejercicios datos con como arreglos arreglo c++ string std move-semantics

valor - pasar matriz por referencia c++



Pasando std:: cadena por valor o referencia (3)

Creo que la respuesta normal es que debe pasarse por valor si necesita hacer una copia en su función. Pásalo por referencia de lo contrario de lo contrario.

Aquí hay una buena discusión: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

Posible duplicado:
¿Están pasando los días de pasar const std :: string & como parámetro?

¿Debo pasar std::string por valor o por referencia (a una función no en línea) si la semántica de movimiento es compatible? ¿Y qué ocurre con las implementaciones que utilizan optimización de cadenas pequeñas (SSO)?


Hay varias respuestas basadas en lo que estás haciendo con la cadena.

1) Usar la cadena como una identificación (no será modificado). Pasarlo por referencia es probablemente la mejor idea aquí: (std::string const&)

2) Modificar la cadena pero no querer que la persona que llama vea ese cambio. Es preferible pasarlo por valor: (std::string)

3) Modificar la cadena pero querer que la persona que llama vea ese cambio. Pasarlo por referencia es preferible: (std::string &)

4) Enviar la cadena a la función y el que llama de la función nunca volverá a utilizar la cadena. Usar la semántica de movimiento podría ser una opción (std::string &&)


Verifique esta respuesta para C ++ 11 . Básicamente, si pasa un lvalue la referencia rvalue

De este artículo :

void f1(String s) { vector<String> v; v.push_back(std::move(s)); } void f2(const String &s) { vector<String> v; v.push_back(s); }

"Para el argumento lvalue, ''f1'' tiene una copia extra para pasar el argumento porque es por valor, mientras que ''f2'' tiene una copia extra para llamar a push_back. Por lo tanto, no hay diferencia; para el argumento rvalue, el compilador tiene que crear un ''Cadena (L'' '')'' y pasar el temporal a ''f1'' o ''f2'' de todos modos. Debido a que ''f2'' puede tomar ventaja de movimiento ctor cuando el argumento es temporal (que es un valor r), los costos de pasar el el argumento es el mismo ahora para ''f1'' y ''f2''. "

Continuando: "Esto significa que en C ++ 11 podemos obtener un mejor rendimiento al usar el enfoque de pasar por valor cuando:

  1. El tipo de parámetro admite semántica de movimiento: todos los componentes de biblioteca estándar lo hacen en C ++ 11
  2. El costo del constructor de movimientos es mucho más barato que el constructor de copias (tanto el tiempo como el uso de la pila).
  3. Dentro de la función, el tipo de parámetro se pasará a otra función u operación que admita tanto copiar como mover.
  4. Es común pasar un argumento temporal: puede organizar su código para hacer esto más.

"

OTOH, para C ++ 98 es mejor pasar por referencia: menos datos se copian. Pasar const o non const depende de si necesita cambiar el argumento o no.