Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Ferrari F1
623 / 520 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
#1

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

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

Дарова всем.

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

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

Разработать функцию определения суммы членов арифметической прогрессии - C++
Разработать функцию определения суммы членов арифметической прогрессии и реализовать ее для трех арифметических прогрессий с разным...

Необходимы комментарии к коду - C++
Можна коментарии к коду #include <windows.h> #include <iostream> using namespace std; int arr = { { 0, 0, 0, 0, 0,...

Необходимы пояснения по коду - C++
Здравствуйте знатоки C++. Прошу не бранить меня сильно за мои вопросы. Только начал изучать C++. Изучаю очереди. Нашел тут хороший топик -...

Когда стоит использовать класс, а когда лучше обойтись без них? - C++
Когда стоит использовать класс, а когда лучше обойтись без них? Когда следует использовать несколько классов? Вот, например. Программа...

Когда надо использовать списки инициализации, а когда можно заменить их констуктором по умолчанию? - C++
1)Любезные,скажите когда надо исп. списки инициализации, а когда можно заменить констуктором по умолчанию? 2) правильно ли...

Когда нужно использовать &ссылки ,а когда *указатели? - C++
Желательно с примерами

11
notAll
434 / 156 / 38
Регистрация: 27.05.2016
Сообщений: 419
Завершенные тесты: 2
12.08.2016, 10:07 #2
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
эти методы нужно определять только когда класс работает с динамической памятью?
И не только для таких классов, в зависимости от ситуации нужно ли нам перемещение вообще. Некоторые классы, например только и перемещаться и могут, а копироваться нет.

Добавлено через 2 минуты
Да, и еще, если мы в классе определим свои ф-ции копирования, то компилятор не будет синтезировать ф-ции перемещения по умолчанию. Следовательно, если они нужны, - их надо писать.
0
Ferrari F1
623 / 520 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
12.08.2016, 10:15  [ТС] #3
notAll, например операция перемещения класса string в этом случае
C++
1
string str1("x"), str2(std::move(str1));
копирует указатель на начало строки str1(пусть в самом примитивном случае это будет именно char*) в str2, зануляет указатель в str1?
В этом заключается перемещение?
0
notAll
434 / 156 / 38
Регистрация: 27.05.2016
Сообщений: 419
Завершенные тесты: 2
12.08.2016, 10:19 #4
В принципе, да.
0
Ferrari F1
623 / 520 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
12.08.2016, 10:21  [ТС] #5
notAll, т.е. перемещение необходимо только когда возникает именно такой контекст, как в приведенном мною примере выше?
0
notAll
434 / 156 / 38
Регистрация: 27.05.2016
Сообщений: 419
Завершенные тесты: 2
12.08.2016, 10:31 #6
И не только. Перемещение надо писать для эффективности кода. Если класс содержит члены, которые без проблем могут быть перемещены, то перемещение будет гораздо эффективнее чем копирование.
0
Ferrari F1
623 / 520 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 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;
};
0
notAll
434 / 156 / 38
Регистрация: 27.05.2016
Сообщений: 419
Завершенные тесты: 2
12.08.2016, 11:12 #8
В этом примере перемещение будет сгенерировано компилятором

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

3) Еще не надо забывать помечать ф-ции перемещения спецификатором noexcept если эти ф-ции действительно не могут кидать исключений. Такая пометка заставит стандартные контейнеры наподоби std::vector перемещать объекты (например при ресайсинге), а не копировать. Это еще одна из причин писать ф-ции перемещения для своих классов.
2
obivan
Падаван С++
418 / 238 / 60
Регистрация: 11.11.2014
Сообщений: 842
Завершенные тесты: 2
12.08.2016, 11:20 #9
notAll, а тут возникает вопрос а не проще ли ссылкой пользоваться
0
Ferrari F1
623 / 520 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
12.08.2016, 11:20  [ТС] #10
notAll,
О пунктах 2 и 3 читал, но все равно спасибо за напоминание об этом.
0
notAll
434 / 156 / 38
Регистрация: 27.05.2016
Сообщений: 419
Завершенные тесты: 2
12.08.2016, 11:23 #11
Цитата Сообщение от obivan Посмотреть сообщение
а тут возникает вопрос а не проще ли ссылкой пользоваться
Не понял хода твоих мыслей.
0
obivan
Падаван С++
418 / 238 / 60
Регистрация: 11.11.2014
Сообщений: 842
Завершенные тесты: 2
12.08.2016, 11:28 #12
notAll, чот херню сморозил ну лан уже, просто подумал смысл делать перемещение, когда у нас объект будет занулятся, как Ferrari F1, написал, если можно на прямую с ним работать например через метод возращающий ссылку

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

Не по теме:

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

0
12.08.2016, 11:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2016, 11:28
Привет! Вот еще темы с ответами:

найти сумму 10-ти членов следующих общих членов,которые даны снизу - C++
найти сумму 10-ти членов следующих общих членов,которые даны снизу {a}_{n}={n}^{3}{e}^{n}

найти сумму 10-ти членов следующих общих членов,которые даны снизу - C++
Найти сумму 10-ти членов следующих общих членов,которые даны снизу. {a}_{n} = {n}^{3}{e}^{-n}

Когда запускаю и ввожу параметры, то, в момент когда программа должна выполнять действие, пишет ошибку - C++
Недавно начали изучать c++. так как в школе не было программирования (преподу пофиг было) я в универе отстаю ;c Написал программу по...

Для чего необходимы списки. - C++
Существуют различные списка наподобие &quot;Односвязный список&quot;, &quot;Двусвязный список &quot;. Объясните для чего они и где обычно используются. их...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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