Передача по ссылке, как правило, лучше, чем передача по значению, если речь идет о производительности (за исключением встроенных типов данных). Так что да, func(string&)
лучше, чем func(string)
. При условии, что переданный string
может быть изменен после завершения функции. Если вы не собираетесь менять string
, используйте func(const string&)
.
С другой стороны, я помню, что где-то читал, что в STL оптимизированы string
. Означает, что если вы передаете string
по значению, это может не обязательно создавать новую строку в куче. Таким образом, передача по стоимости может оказаться не такой уж дорогой, как вы ожидаете. например,
string s1 = "hello"; // new buffer allocated on heap and copied "hello"
string s2 = s1; // s2 and s1 both 'may' refer to same heap
...
s1 += " world"; // s2 continue referring to old heap ...
// new heap created to accomodate "hello world" referred by s1