Ответ 1
Идея "Хоть скорость? Передача по значению" (1) заключается в том, что иногда копия может быть удалена. Принимая ваши классы X
и Y
, рассмотрим этот вопрос:
// Simulating a complex operation returning a temporary:
std::string foo() { return "a" + std::string("b"); }
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) {}
};
int main()
{
X(foo());
Y(foo());
}
Теперь проанализируем как конструктивные случаи.
X
сначала. foo()
возвращает временный, который используется для инициализации объекта name
. Затем этот объект перемещается в mem_name
. Обратите внимание, что компилятор может применить Оптимизацию возвращаемого значения и построить возвращаемое значение foo()
(фактически даже возвращаемое значение operator+
) непосредственно в пространстве name
. Поэтому никакого копирования на самом деле не происходит, только движение.
Теперь проанализируем Y
foo()
возвращает временный снова, который связан с опорным name
. Теперь нет "внешнего поставленного" пространства для возвращаемого значения, поэтому его нужно построить в своем собственном пространстве и привязать к ссылке. Затем он копируется в mem_name
. Поэтому мы делаем копию, никоим образом не обходим ее.
Короче говоря, результат:
-
Если передается значение
mem_name
, то иX
иY
будут выполнять копию (X
при инициализацииname
,Y
при инициализацииmem_name
). Кроме того,X
будет выполнять движение (при инициализацииmem_name
). -
Если rvalue передается,
X
потенциально может выполнять только движение, аY
должен выполнить копию.
Как правило, ожидается, что движение будет операцией, чьи требования времени сопоставимы с требованиями при передаче указателя (что является передачей по ссылке). Таким образом, X
не хуже Y
для lvalues и лучше для rvalues.
Конечно, это не абсолютное правило, и его нужно принимать с солью. Если есть сомнения, профиль.
(1) Ссылка подвержена временной недоступности, и по состоянию на 11-12-2014 она кажется нарушенной (404). Копия содержимого (хотя и со странным форматированием) доступна на нескольких сайтах блога:
В качестве альтернативы исходное содержимое может быть доступно через машину обратного пути.
Также обратите внимание, что эта тема в целом вызвала довольно дискуссию. Поиск в заголовке бумаги приводит к появлению большого количества контрольных точек и контрольных точек. Чтобы привести пример одного из них, "Хотите скорость?" (Не всегда) передается по значению " SO member juanchopanza