Mientras refactoreo de algunos códigos encontré algunos métodos getter que devuelven una cadena std ::. Algo como esto, por ejemplo:Devolviendo una referencia constante a un objeto en lugar de una copia
class foo
{
private:
std::string name_;
public:
std::string name()
{
return name_;
}
};
Sin duda, el comprador sería mejor devolver un const std::string&
? El método actual es devolver una copia que no es tan eficiente. ¿Devolvería una referencia const en su lugar causaría algún problema?
Quién dijo que no era eficiente. Se ha trabajado mucho en std :: string para que esta operación sea eficiente. Hay una diferencia entre pasar una referencia y un strincg, pero la diferencia real suele ser insignificante. –
@Loki: nada dice que será eficiente, y de hecho, la versión más reciente de C++ dice que probablemente lo sea. la única optimización que haría que ese código fuera razonablemente eficiente sería una std :: string contada por referencia. Sin embargo, muchas implementaciones de STL no hacen recuento de referencias, ya que en las CPU multinúcleo modernas es mucho más lento administrar recuentos de referencia de lo que se podría pensar. Entonces sí, devolver una copia es mucho más lento. Ni GCC ni STL de Microsoft han hecho recuentos de referencia en std :: string en muchos años. –
@seanmiddleditch: Mida siempre antes de asumir (eso es todo lo que digo). También hay muchas otras optimizaciones que el compilador puede aplicar: Inlinear y copiar elisión serían dos que reducen el costo a cero. –