Передача std::string по значению или ссылке
Возможный дубликат:
Являются ли дни прохождения const std::string и как параметр более?
Должен ли я передавать std::string
по значению или по ссылке (для неиндексированной функции), если поддерживается семантика перемещения? А как насчет реализации с использованием оптимизации небольших строк (SSO)?
Ответы
Ответ 1
Существует несколько ответов, основанных на том, что вы делаете со строкой.
1) Использование строки в качестве идентификатора (не будет изменено). Передача его в const-ссылке, вероятно, самая лучшая идея здесь: (std::string const&)
2) Изменение строки, но не желание вызывающего абонента увидеть это изменение. Предпочтительнее передать его по значению: (std::string)
3) Изменение строки, но при этом вызывающая сторона должна увидеть это изменение. Предпочтительнее передать его по ссылке: (std::string &)
4) Отправка строки в функцию, и вызывающая функция никогда больше не будет использовать эту строку. Использование переместить семантику может быть опцией (std::string &&)
Ответ 2
Отметьте этот ответ для С++ 11. В принципе, если вы передаете значение lvalue, значение rvalue
Из в этой статье:
void f1(String s) {
vector<String> v;
v.push_back(std::move(s));
}
void f2(const String &s) {
vector<String> v;
v.push_back(s);
}
"Для аргумента lvalue 'f1 имеет одну дополнительную копию для передачи аргумента, потому что она имеет значение, в то время как' f2 имеет одну дополнительную копию для вызова push_back. Поэтому никакой разницы: для аргумента rvalue компилятор должен создать временную 'String (L" ") и передать временное значение' f1 или 'f2 в любом случае. Поскольку f2 может использовать перемещение ctor, когда аргумент является временным (это rvalue), затраты на передачу аргумента то же самое теперь для 'f1 и' f2."
Продолжение:
"
Это означает, что в С++ 11 мы можем получить более высокую производительность, используя метод pass-by-value, когда:
- Тип параметра поддерживает семантику перемещения - все стандартные компоненты библиотеки выполняются в С++ 11
- Стоимость конструктора перемещения намного дешевле, чем конструктор копирования
(как время, так и использование стека).
- Внутри функции тип параметра будет передан другой функции или операции
который поддерживает как копирование, так и перемещение.
- Обычно принято считать временным аргументом. Вы можете организовать код, чтобы сделать это больше.
"
OTOH, для С++ 98 лучше всего перейти по ссылке - меньше данных копируется. Передача const или non const зависит от необходимости изменения аргумента или нет.
Ответ 3
Я считаю, что обычный ответ заключается в том, что он должен быть передан по значению, если вам нужно сделать его копию в своей функции. Передайте его по ссылке const в противном случае.
Вот хорошее обсуждение: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/