Я всегда учил, что непримитивные типы должны быть переданы по константной ссылке, а не по значению, где это возможно, а именно:Должны ли передаваться небольшие простые структуры по ссылке 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 по ссылке, это на самом деле дороже, чем передача по значению, так как компилятор теперь использует указатель и разыменования для доступа к константный Vector2 & поз версия?
В этом случае? Являются ли простые объекты лучшими, переданными по значению? Где должна быть проведена линия?
Обратите внимание, что если ваш тип класса имеет объявленные пользователем конструкторы, это не POD. –
Общее правило: Pass by const-reference, если 'sizeof (T) <= sizeof (void *)' или 'T' является примитивным. – GManNickG
@GMan, вы избили меня до него (и +1). Хотя, я бы обобщил, что он, вероятно, меньше или равен размеру слова процессора. И нужно проверить спецификации процессора, чтобы узнать оптимальный размер. Если я не ошибаюсь, компиляторы могли бы потенциально оптимизировать const ref для передачи по значению в некоторых случаях, независимо от размера. Я бы предположил, что это особенно верно в C++ 0x с учетом новой семантики перемещения. –