Перемещение значения объекта в другое, но избегать копирования - PullRequest
1 голос
/ 05 марта 2019

Существует сценарий, когда я получаю ответ от API через обратный вызов и мне нужно переместить объекты в ответ на мою переменную члена класса, чтобы продолжить обработку.Достигнет ли следующий код цели:

class Obj {
public:
 Obj (unit32_t& x, std::string& x, int& data)
{}
... lot of variable .. no pointers
};
class A
{
public:
 A(Obj& r):pvtmemVarTyOfObj(0,"",0) {}
 private:
 Obj pvtmemVarTyOfObj ;
};

void A::GetResponse(Obj&& resp)
{
  //pvtmemVarTyOfObj = std::forward<Obj>(std::move(resp));
   pvtmemVarTyOfObj = std::move(resp);

}

Будет ли этот код действительно перемещен в переменную-член pvtmemVarTyOfObj?Просто чтобы убедиться, что нет копирования, так как это приведет к огромным затратам на обработку?

Ответы [ 2 ]

1 голос
/ 05 марта 2019

Просто используйте std::move(resp) здесь. Вы точно знаете, что resp - это rvalue ссылка , поэтому вы всегда хотите двигаться.

Если бы Obj был параметром шаблона, вам нужно было бы использовать std::forward<Obj>(resp). Потому что в этом случае Obj&& будет универсальной ссылкой , которая может быть rvalue или lvalue ссылка и std::forward выводит можно ли resp перемещать или нет.

В конце концов, выполняется ли копирование или перемещение, зависит от операторов присваивания класса pvtmemVarTyOfObj. Если он содержит только простые данные и не выделяет ресурсы (например, с помощью указателей), перемещение не может дать никаких преимуществ.

0 голосов
/ 05 марта 2019

Конструктор перемещения и оператор присваивания перемещения выполняют только то, для чего они запрограммированы вами, программистом.Технически они могут быть спроектированы так, чтобы делать что угодно, но это не рекомендуется.
Скорее, они должны быть спроектированы так, чтобы сделать целевой объект неотличимым от исходного объекта, оставив исходный объект в допустимом состоянии.
ЕслиВы не предоставляете операцию перемещения самостоятельно, она будет синтезирована посредством перемещения по элементам.
Перемещение для основных типов, таких как int, просто сделайте копию.
Перемещение для многих библиотечных типов, напримерпоскольку std::vector, std::string и std::unique_ptr предназначены разработчиком библиотеки для передачи права собственности на ресурсы, такие как память.
Это означает, что для выделенного стека POD просто нетспособ избежать копирования.Если операция критична по производительности, а копия просто неприемлема, решение может состоять в том, чтобы не иметь выделенного в стеке POD, например, вставив объект в std::unique_ptr.
Другой вариант можетбыть только когда-либо иметь целевой объект, и позволить другим "доступ" к этому объекту через указатели или ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...