Tenga en cuenta que su primera implementación ingenua es muy nativa, ya que no se pasa nada por referencia. Asumiré que este fue un ejemplo realmente ingenuo y que no hay necesidad de recordar a los lectores los beneficios de pasar por referencia en lugar de por valor.
Tenga en cuenta, también, que he utilizado los operadores de función no miembro, en lugar de las funciones de miembro, pero al final, los resultados son (casi) los mismos.
Si usted quiere estar seguro de no se creará una copia necesario, usted debe tratar de una versión no-operador:
void add(Matrix & result, const Matrix & lhs, const Matrix & rhs) ;
Si desea hacerlo de la manera operador (que es mi solución preferida) , entonces debes asumir que el operador + creará un temporal. A continuación, debe definir tanto el operador + y el operador + =:
Matrix & operator += (Matrix & result, const Matrix & rhs) ;
{
// add rhs to result, and return result
return result ;
}
Matrix operator + (const Matrix & lhs, const Matrix & rhs) ;
{
Matrix result(lhs) ;
result += rhs ;
return result ;
}
Ahora, usted podría tratar de "apalancamiento" optimizaciones del compilador y escribir como:
Matrix & operator += (Matrix & result, const Matrix & rhs) ;
{
// add rhs to result, and return result
return result ;
}
Matrix operator + (Matrix lhs, const Matrix & rhs)
{
return lhs += rhs ;
}
Según lo propuesto por Herb Sutter en C++ Estándares de Codificación, 27. Prefiero las formas canónicas de la aritmética y de asignación de los operadores de, p48-49:
Una variación es tener operador @ [@ siendo +, -, lo que sea] aceptar su primer parámetro por valor. De esta forma, usted hace los arreglos para que el compilador realice la copia para usted implícitamente, y esto puede darle más flexibilidad al compilador al aplicar optimizaciones.
¿Qué tan grandes son sus matrices? ¿Cuáles son tus objetivos de rendimiento? ¿Has intentado medir el rendimiento o el costo de la copia? –
Si las matrices son incluso un poco grandes, creo que el gasto de devolver la matriz sería mucho menor que realizar la adición – randomThought
¿Por qué no pasar como 'const Matrix & other'? – kennytm