Я бы подумал, хотите ли вы использовать семантику значения или ссылки, прежде чем беспокоиться об оптимизации.Обычно вы передаете по ссылке, если хотите, чтобы вызываемый вами метод мог изменять параметр.В этом случае вы можете передать указатель, как это было бы в C, но идиоматический C ++ имеет тенденцию использовать ссылки.
Нет правила, согласно которому маленькие типы или перечисления всегда должны передаваться по значению.Существует много кода, который передает параметры int&
, потому что они основаны на семантике передачи по ссылке.Кроме того, вы должны помнить, что для любого относительно небольшого типа данных вы не заметите разницу в скорости между передачей по ссылке и по значению.
При этом, если у вас очень большая структура, вывероятно, не хочу делать много копий этого.Это где const
ссылки удобны.Имейте в виду, что const
в C ++ не строго соблюдается (даже если это считается плохой практикой, вы всегда можете const_cast
отказаться от него).Нет никаких оснований для передачи const int&
через int
, хотя есть причина для передачи const ClassWithManyMembers&
через ClassWithManyMembers
.
Все перечисленные вами структуры, я бы сказал,хорошо передать по значению, если вы хотите, чтобы они рассматривались как значения.Учтите, что если вы вызываете функцию, которая принимает один параметр типа struct Rectangle{int x, y, w, h}
, это то же самое, что независимо передавать эти 4 параметра, что на самом деле не имеет большого значения.Как правило, вам следует больше беспокоиться о работе, которую должен выполнять конструктор копирования - например, передача vector
по значению, вероятно, не очень хорошая идея, поскольку ему придется динамически выделять память и выполнять итерацию по списку, размер котороговы не знаете, и вызываете еще много конструкторов копирования.
Хотя вы должны помнить обо всем этом, хорошее общее правило таково: если вам нужна семантика референса, проходите мимо референса.В противном случае передайте внутренние значения по значению, а другие - по константной ссылке.
Кроме того, в C ++ 11 введены ссылки на r-значения, которые еще более усложняют ситуацию.Но это другая тема.