Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Ferrari F1
=^_^=
511 / 407 / 88
Регистрация: 27.01.2015
Сообщений: 2,339
Записей в блоге: 1
Завершенные тесты: 1
#1

Когда необходимы определения членов-перемещения - C++

12.08.2016, 09:54. Просмотров 212. Ответов 11
Метки нет (Все метки)

Дарова всем.

Не так давно прочел про конструкторы перемещения и соотв. операторы присваивания с перемещением.

И возник такой вопрос: эти методы нужно определять только когда класс работает с динамической памятью?
А для таких классов смысла определения операций перемещения нет?
C++
1
2
3
4
5
class
{
  int x, y;
  double z;
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2016, 09:54     Когда необходимы определения членов-перемещения
Посмотрите здесь:

Перестало выводить, когда задание списков перевел в конструкторы, когда были просто функции выводило нормально. C++
Для чего необходимы списки. C++
Необходимы пояснения по коду C++
C++ Когда надо использовать списки инициализации, а когда можно заменить их констуктором по умолчанию?
Записать условия когда является истинным , когда: C++
C++ Когда используется * перед указателями, а когда нет?
Когда стоит использовать класс, а когда лучше обойтись без них? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
notAll
382 / 103 / 21
Регистрация: 27.05.2016
Сообщений: 261
Завершенные тесты: 2
12.08.2016, 10:07     Когда необходимы определения членов-перемещения #2
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
эти методы нужно определять только когда класс работает с динамической памятью?
И не только для таких классов, в зависимости от ситуации нужно ли нам перемещение вообще. Некоторые классы, например только и перемещаться и могут, а копироваться нет.

Добавлено через 2 минуты
Да, и еще, если мы в классе определим свои ф-ции копирования, то компилятор не будет синтезировать ф-ции перемещения по умолчанию. Следовательно, если они нужны, - их надо писать.
Ferrari F1
=^_^=
511 / 407 / 88
Регистрация: 27.01.2015
Сообщений: 2,339
Записей в блоге: 1
Завершенные тесты: 1
12.08.2016, 10:15  [ТС]     Когда необходимы определения членов-перемещения #3
notAll, например операция перемещения класса string в этом случае
C++
1
string str1("x"), str2(std::move(str1));
копирует указатель на начало строки str1(пусть в самом примитивном случае это будет именно char*) в str2, зануляет указатель в str1?
В этом заключается перемещение?
notAll
382 / 103 / 21
Регистрация: 27.05.2016
Сообщений: 261
Завершенные тесты: 2
12.08.2016, 10:19     Когда необходимы определения членов-перемещения #4
В принципе, да.
Ferrari F1
=^_^=
511 / 407 / 88
Регистрация: 27.01.2015
Сообщений: 2,339
Записей в блоге: 1
Завершенные тесты: 1
12.08.2016, 10:21  [ТС]     Когда необходимы определения членов-перемещения #5
notAll, т.е. перемещение необходимо только когда возникает именно такой контекст, как в приведенном мною примере выше?
notAll
382 / 103 / 21
Регистрация: 27.05.2016
Сообщений: 261
Завершенные тесты: 2
12.08.2016, 10:31     Когда необходимы определения членов-перемещения #6
И не только. Перемещение надо писать для эффективности кода. Если класс содержит члены, которые без проблем могут быть перемещены, то перемещение будет гораздо эффективнее чем копирование.
Ferrari F1
=^_^=
511 / 407 / 88
Регистрация: 27.01.2015
Сообщений: 2,339
Записей в блоге: 1
Завершенные тесты: 1
12.08.2016, 10:37  [ТС]     Когда необходимы определения членов-перемещения #7
notAll, а если класс содержит вектор, то желательно уже определить перемещение?
C++
1
2
3
4
5
6
class
{
  int x, y;
  double z;
  vector<int> t;
};
notAll
382 / 103 / 21
Регистрация: 27.05.2016
Сообщений: 261
Завершенные тесты: 2
12.08.2016, 11:12     Когда необходимы определения членов-перемещения #8
В этом примере перемещение будет сгенерировано компилятором

Добавлено через 31 минуту
Я думаю, руководствоваться надо так:
1) если переменные члены нашего класса могут быть скопированы или перемещены по умолчанию, то, в большинстве случаев, можно положиться на генерируемые компилятором операции копирования и перемещения по умолчанию
2) но, если мы по каким то причинам пишем ф-ции копирования, то в этом случае ф-ции перемещения надо будет, как правило, тоже писать (или возможно определить их с пометкой default). Иначе компилятор их генерировать не будет.

3) Еще не надо забывать помечать ф-ции перемещения спецификатором noexcept если эти ф-ции действительно не могут кидать исключений. Такая пометка заставит стандартные контейнеры наподоби std::vector перемещать объекты (например при ресайсинге), а не копировать. Это еще одна из причин писать ф-ции перемещения для своих классов.
obivan
Падаван С++
396 / 216 / 56
Регистрация: 11.11.2014
Сообщений: 755
Завершенные тесты: 2
12.08.2016, 11:20     Когда необходимы определения членов-перемещения #9
notAll, а тут возникает вопрос а не проще ли ссылкой пользоваться
Ferrari F1
=^_^=
511 / 407 / 88
Регистрация: 27.01.2015
Сообщений: 2,339
Записей в блоге: 1
Завершенные тесты: 1
12.08.2016, 11:20  [ТС]     Когда необходимы определения членов-перемещения #10
notAll,
О пунктах 2 и 3 читал, но все равно спасибо за напоминание об этом.
notAll
382 / 103 / 21
Регистрация: 27.05.2016
Сообщений: 261
Завершенные тесты: 2
12.08.2016, 11:23     Когда необходимы определения членов-перемещения #11
Цитата Сообщение от obivan Посмотреть сообщение
а тут возникает вопрос а не проще ли ссылкой пользоваться
Не понял хода твоих мыслей.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2016, 11:28     Когда необходимы определения членов-перемещения
Еще ссылки по теме:

Необходимы комментарии к коду C++
Разработать функцию определения суммы членов арифметической прогрессии C++
C++ Когда запускаю и ввожу параметры, то, в момент когда программа должна выполнять действие, пишет ошибку
C++ найти сумму 10-ти членов следующих общих членов,которые даны снизу
C++ найти сумму 10-ти членов следующих общих членов,которые даны снизу

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
obivan
Падаван С++
396 / 216 / 56
Регистрация: 11.11.2014
Сообщений: 755
Завершенные тесты: 2
12.08.2016, 11:28     Когда необходимы определения членов-перемещения #12
notAll, чот херню сморозил ну лан уже, просто подумал смысл делать перемещение, когда у нас объект будет занулятся, как Ferrari F1, написал, если можно на прямую с ним работать например через метод возращающий ссылку

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от notAll Посмотреть сообщение
Не понял хода твоих мыслей.
я сам уже чото не понимаю

Yandex
Объявления
12.08.2016, 11:28     Когда необходимы определения членов-перемещения
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru