Re: Про перемещение (на примере кода)
От: Кодт Россия  
Дата: 17.03.25 10:26
Оценка:
Здравствуйте, Shmj, Вы писали:

По существу незаданного вопроса.

Не надо бояться промежуточных копирований, а тем более, промежуточных перемещений.
Если объект сам по себе не слишком большого размера, то даже если компилятор не оптимизирует размещение его промежуточных копий, то правильно написанный (а в ряде случаев — реализованный по умолчанию) конструктор перемещения не отнимет много процессорного времени.
Всякие там std::vector прекрасно перемещаются сами — передавая своё содержимое от одного экземпляра другому.

Объекты надо возвращать (и желательно, принимать тоже) по значению, а не по rvalue-ссылке.
Так ты с большей гарантией не получишь висячую ссылку, как в коде примера.

Соответственно, дизайн кода у обёртки — например, такой
TrackedClass Wrapper::take() { return std::move(_trackedClass); }

TrackedClass fun1() {
  Wrapper w;
  return w.take();
}

Здесь мы говорим, что ссылка на поле — временная, поэтому конструктор возвращаемого значения — это конструктор перемещения. То есть, можно украсть контент.

Если же объект реально тяжеловесный сам по себе, и не хочется морочить голову вопросами его перемещения — то умные указатели тебе в помощь. Заодно и работу со стеком разгрузишь.
std::unique_ptr не имеет конструктора копирования, так что заодно получишь диагностику от компилятора обо всех местах, где ты явно или неявно пытался копировать вместо перемещения. Ну и там, где нужно именно копирование, — сделаешь его руками.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.