Поправьте меня если я ошибаюсь. Скажем, у меня есть:
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)
{}
...
};
В ctor X
name
, очевидно, является копией любого аргумента, переданного X
, X
вызывает ctor перемещения std::string
для инициализации mem_name
, верно?
Назовем это копировать-затем-переместить на X*; две операции: КОПИРОВАНИЕ, ПЕРЕМЕЩЕНИЕ.
В ctor Y
name
является константной ссылкой, что означает, что фактической копии элемента нет, потому что мы имеем дело непосредственно с аргументом, переданным из того места, где должен быть создан объект Y
. Но затем мы скопировали name
, чтобы инициализировать mem_name
в Y
; одна операция: КОПИРОВАНИЕ. Конечно, поэтому он должен быть намного быстрее (и предпочтительнее для меня)?
В докладе Скотта Мейера о GN13 (примерно 8:10 и 8:56) он говорит о "Хотите скорости? Передавайте по значению", и мне интересно, есть ли разница в производительности или потери при передаче аргументы (или строки, если быть точным) по ссылке и передаче по значению "для увеличения скорости?"
Я знаю, что передача аргументов по значению может быть дорогостоящей, особенно при работе с большими данными.
Может быть (очевидно?) я что-то упускаю из его речи?