Siempre me ha enseñado que los tipos no primitivos deben ser pasados por referencia const en lugar de por su valor siempre que sea posible, es decir:¿Deberían pasar estructuras simples pequeñas por referencia constante?
void foo(std::string str);//bad
void foo(const std::string &str);//good
Pero estaba pensando hoy que tal vez en realidad algunos tipos definidos por el usuario simples pueden ser en realidad mejor pasa por valor, por ejemplo:
class Vector2
{
public:
float x, y;
...constructors, operators overloads, utility methods, etc...
};
void foo(Vector2 pos);
void foo(const Vector2 &pos);//is this really better than by value?
void foo(float x, float y);//after all isn't by value effectively doing this?
Mi pensamiento es que al pasar el Vector2 por referencia, en realidad es más caro que el paso por valor ya que el compilador está en usar un puntero y la eliminación de referencias para acceder a la const Vector2 & pos ¿versión?
¿Es este el caso? ¿Los objetos simples se pasan mejor por valor? ¿Dónde debería dibujarse la línea?
Tenga en cuenta que si su tipo de clase tiene constructores declarados por el usuario, no es POD. –
La regla general: Pase por const-reference, a menos que 'sizeof (T) <= sizeof (void *)' o 'T' sea primitivo. – GManNickG
@GMan, me ganaste (y +1). Aunque, generalizaría que probablemente sea menor o igual que el tamaño de palabra del procesador. Y, uno debe verificar las especificaciones del procesador para descubrir el tamaño óptimo. Si no me equivoco, los compiladores podrían optimizar una constante de referencia a un valor de aprobación en algunos casos, independientemente del tamaño. Me imagino que esto es especialmente cierto en C++ 0x dada la nueva semántica de movimiento. –