Подтвердить что ты не робот

Передача std::string по значению или ссылке

Возможный дубликат:
Являются ли дни прохождения const std::string и как параметр более?

Должен ли я передавать std::string по значению или по ссылке (для неиндексированной функции), если поддерживается семантика перемещения? А как насчет реализации с использованием оптимизации небольших строк (SSO)?

4b9b3361

Ответ 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/