Как передать функцию std::string функции?

Должен ли я всегда передавать std::string по ссылке const на функцию, если все, что делается внутри этой функции, - это скопировать эту строку? Кроме того, какая разница (перф или иначе) между передачей по значению и передачей по ссылке? Насколько я понимаю, используется operator= и другой конструктор. Это тот случай?

Ответ 1

Должен ли я всегда передавать ссылку std::string на const ссылкой на функцию, если все, что сделано внутри этой функции, - это скопировать эту строку?

Нет. Если вы собираетесь просто скопировать строку внутри функции, вы должны передать ее по значению. Это позволяет компилятору выполнять несколько оптимизаций. Для более, прочитайте Dave Abraham "Хотите скорость? Передайте по значению" .

В чем разница (перф или иначе) между передачей по значению и передачей по ссылке? Насколько я понимаю, используется оператор = и другой конструктор. Это тот случай?

Нет, это совсем не так. Ссылка не является объектом; это ссылка на объект. Когда вы проходите по значению, делается копия передаваемого объекта. Когда вы проходите по ссылке, делается ссылка на существующий объект и нет копии. Хорошая вводная книга на С++ подробно объяснит эти основные понятия. Крайне важно понять основы, если вы хотите разработать программное обеспечение на С++.

Ответ 2

Не верьте всему, что вы читаете в Интернете. Лучше перейти по ссылке const. Чтобы дать доказательство, я написал тестовую программу...

test.cpp:

#include <ctime>
#include <iostream>
#include <string>

void foo(std::string s);
void bar(const std::string& s);

int main() {
    const std::string s("test string");

    clock_t start = clock();
    for (int it = 0; it < 1000000; ++it)
        foo(s);
    std::cout << "foo took " << (clock() - start) << " cycles" << std::endl;

    start = clock();
    for (int it = 0; it < 1000000; ++it)
        bar(s);
    std::cout << "bar took " << (clock() - start) << " cycles" << std::endl;
}

aux.cpp:

#include <string>
std::string mystring;

void foo(std::string s) { mystring = s; }
void bar(const std::string& s) { mystring = s; }

Скомпилирован с 'g++ -O3 test.cpp aux.cpp' и получил распечатку:

foo took 93044 cycles
bar took 10245 cycles

Передача по ссылке быстрее на порядок.