Мне всегда учили, что непримитивные типы должны передаваться по ссылке const, а не по значению, где это возможно, например:
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 версии?
Это так? Являются ли простые объекты лучшими, переданными по значению? Где должна быть проведена линия?