Исправьте меня, если я ошибаюсь. Скажем, у меня есть:
struct X
{
std::string mem_name;
X(std::string name)
: mem_name(std::move(name))
{}
...
};
struct Y
{
std::string mem_name;
Y(const std::string &name)
: mem_name(name)
{}
...
};
В X
ctor, name
, очевидно, является копией любого переданного аргумента в X
, X
вызывает перемещение ctor std::string
для инициализации mem_name
, правильно?
Позвольте называть это copy-then-move на X *; две операции: COPY, MOVE.
В Y
ctor, name
является константой ref, что означает, что нет фактической копии элемента, потому что мы имеем дело непосредственно с аргументом, переданным из того места, где должен быть создан объект Y
. Но затем мы скопировали name
для инициализации mem_name
в Y
; одна операция: КОПИЯ. Конечно, это должно быть намного быстрее (и предпочтительнее для меня)?
В разговоре Скотта Мейера GN13 (примерно с временными рамками 8:10 и 8:56) он говорит о "Требуется скорость? Передайте значение" , и мне было интересно, есть ли разница в производительности или потеря в передаваемых аргументах (или, если точнее, строк) путем ссылки и передачи по значению "для того, чтобы получить скорость?".
Я знаю, что передача аргументов по стоимости может быть дорогостоящей, особенно при работе с большими данными.
Может быть (ясно?) есть что-то, чего я не хватает в его разговоре?