Меня всегда учили, что не примитивные типы должны передаваться по константной ссылке, а не по значению, где это возможно, то есть:
void foo(std::string str);//bad
void foo(const std::string &str);//good
Но сегодня я думал, что, возможно, на самом деле некоторые простые пользовательские типы могут лучше передаваться по значению, например:
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?
Я думаю, что, передав Vector2 по ссылке, это на самом деле дороже, чем передавать по значению, поскольку компилятор теперь использует указатель и разыменование для доступа к const версии Vector2 & pos?
Это так? Простые объекты лучше всего передаются по значению? Где должна быть проведена линия?