Мне интересно, считается ли строка С++ достаточно малой, чтобы быть более эффективной при передаче по значению, чем по ссылке.
Передача строк С++ по значению или по ссылке
Ответ 1
Нет. Передайте его по ссылке:
void foo(const std::string& pString);
Как правило, передавайте ссылки по статьям, если они имеют нетривиальный конструктор-копию, иначе по-значение.
Строка обычно состоит из указателя на данные и счетчика длины. Он может содержать более или менее, поскольку он определен как реализация, но вряд ли ваша реализация использует только один указатель.
В коде шаблона вы также можете использовать const T&
, так как определение функции будет доступно компилятору. Это означает, что он может решить, должно ли оно быть ссылкой или нет для вас. (Я думаю)
Ответ 2
Определенно нет. Если ваша конкретная реализация не имеет семантики копирования-на-запись (редко в эти дни из-за проблем с потоками), вся строка должна быть скопирована, когда она передается по значению (даже если фактические строковые данные хранятся в куче). Даже если строковый объект сам по себе представляет собой только пару указателей внутри, объем данных, подлежащих копированию, является линейным по длине строки.