Todavía no estoy muy seguro de cuándo la devolución por valor es una buena idea en C ++ y cuándo no. En el siguiente caso, ¿está bien?

vector<int> to_vec(const Eigen::MatrixXi& in){
    vector<int> out;
    // copy contents of in into out
    return out;
}

Eigen::MatrixXi to_eigen(const vector<int>& in){
    Eigen::MatrixXi out;
    // copy contents of in into out
    return out
}

Dependiendo de cómo esos objetos vector y MatrixXi realmente funcionen, podría resultar en una copia costosa. Por otro lado, supongo que aprovechan la funcionalidad mover de C ++ para copiar de forma económica reutilizando los datos subyacentes.

Sin conocer exactamente la implementación, ¿qué puedo asumir?

0
Michael 13 dic. 2016 a las 13:14

2 respuestas

La mejor respuesta

En una situación en la que declara una variable local, la inicializa y la devuelve por valor, puede estar bastante seguro al asumir que su compilador elide la copia.

Este caso se conoce como optimización del valor de retorno con nombre . Esencialmente, en lugar de asignar el valor de retorno en la llamada a la función, se hará en el sitio de la llamada y se pasará como referencia. La devolución por valor es la mejor opción aquí, ya que no necesita declarar una variable en el sitio de la llamada para pasar, pero el rendimiento será como si lo hubiera hecho.

En C ++ 17, la elisión de copia será obligatorio en la mayoría de los casos que involucran prvalues ​​(por ejemplo, T t = get_t(); o return get_t()), pero sigue siendo opcional para NRVO.

3
Community 23 may. 2017 a las 11:53

Las reglas de Thumb con respecto a los valores de retorno en C ++ son:

  1. nunca devuelva una referencia a una variable local
  2. nunca devuelva un puntero a una variable local
  3. no devuelva un valor con nombre usando la semántica de movimiento

En cuanto a (3) - Esta es una preocupación conocida con C ++ - todos aprendimos que cuando un objeto regresa por valor - activa el constructor de copia. esto es teóricamente cierto, pero prácticamente incorrecto. el compilador utilizará elisión de copia en objetos cuando la optimización esté activada.

elisión de copia es una técnica de optimización que hace que el valor se cree dentro del alcance del llamante y no en el alcance del destinatario, evitando así una copia costosa. la modificación de ese objeto se llevará a cabo en el ámbito del destinatario.

En cuanto a (1) y (2), también hay un caso de esquina con respecto a las corrutinas y los generadores, pero a menos que sepa que está tratando con ellos, (1) y (2) siempre son válidos.

2
David Haim 13 dic. 2016 a las 10:42