Это будет выполнено с 1 копией и 3-мя ходовыми конструкциями.
- Составьте копию
a
, чтобы связаться с lhs
.
- Переместить конструкцию
lhs
из первых +
.
- Возврат первого
+
будет привязан к значению lhs
параметр второго +
с разрешением.
- Возврат второго
lhs
приведет к второму движению.
- Возврат третьего
lhs
приведет к третьему движению.
- Временное возвращение с третьего
+
будет построено по адресу sum
.
Для каждой описанной выше конструкции перемещения имеется другая конструкция перемещения, которая необязательно удалена. Таким образом, вы только гарантировали, чтобы иметь 1 копию и 6 ходов. Но на практике, если вы не -fno-elide-constructors
, у вас будет 1 копия и 3 хода.
Если вы не ссылаетесь на a
после этого выражения, можно дополнительно оптимизировать с:
X sum = std::move(a) + b + c + d;
в результате 0 копий и 4 ходов (7 ходов с -fno-elide-constructors
).
Приведенные выше результаты были подтверждены с помощью X
, который имеет инструменты для копирования и перемещения конструкторов.
Update
Если вы заинтересованы в различные способы оптимизации этого, вы могли бы начать с перегрузкой и LHS на X const&
и X&&
:
friend X operator+(X&& lhs, X const& rhs) {
lhs += rhs;
return std::move(lhs);
}
friend X operator+(X const& lhs, X const& rhs) {
auto temp = lhs;
temp += rhs;
return temp;
}
Это получает вещи вниз 1 копия и 2 хода. Если вы готовы ограничить клиентов из когда-либо поймать возвращение ваших +
по ссылке, то вы можете вернуть X&&
одного из перегруженных, как это:
friend X&& operator+(X&& lhs, X const& rhs) {
lhs += rhs;
return std::move(lhs);
}
friend X operator+(X const& lhs, X const& rhs) {
auto temp = lhs;
temp += rhs;
return temp;
}
Получение вас до 1 экземпляр и 1 ход. Обратите внимание, что в этой последней конструкции, если вы когда-либо клиент делает это:
X&& x = a + b + c;
затем x
является оборванной ссылкой (поэтому std::string
не это делать).
Так не цепочки элиции? например построив возврат 'a + b' непосредственно в' operator + (??, c) '? – Barry
Я даже не думаю, что законно возвращать «lhs». Однако я также не думаю, что у кого-либо из авторов компилятора была какая-то мотивация сделать его законным (никто его не пытается). –
Почему это может быть незаконным? Может ли это стать законным в будущем? – Orient