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

move семантика - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.83
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
05.11.2012, 17:24     move семантика #1
Сейчас стало появляться нечто вроде такого:

C++
1
2
3
4
5
6
7
8
class X
{
public:
   X (const X& lvalue); // copy constructor
   X (X&& rvalue); // move constructor
   X& operator= (const X& lvalue); // copy assignment operator
   X& operator= (X&& rvalue); // move assignment operator
};
Сразу вот непонятно в чем тут фишка и для чего это нужно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
05.11.2012, 17:26     move семантика #2
Уже гуглили на эту тему или закидать вас ссылками?
Если коротко, то move быстрее, чем copy
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
05.11.2012, 17:26     move семантика #3
Нужно для эффективности
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
05.11.2012, 18:15  [ТС]     move семантика #4
Цитата Сообщение от I.M. Посмотреть сообщение
Уже гуглили на эту тему или закидать вас ссылками?
Если коротко, то move быстрее, чем copy
Нет я не гуглил, поскольку читаю прямо по новому изданию Библиотеки Джоустиса. Просто есть некоторые непонятки, многие из которых обусловлены может быть тем, что на начальных страницах темы эти раскрыты неполностью, а другие тем, что в Visual C++ 2012 реализовано очень ограниченный объем от C++ 11.
Непонятно вот что, а что происходит например с переменными s и t при таком раскладе.

C++
1
2
string s("aaa"), t("bbb");
pair<string, string> p(std::move(s), std::move(t));
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 1
05.11.2012, 18:18     move семантика #5
http://www.cyberforum.ru/blogs/174410/blog826.html
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
05.11.2012, 18:29  [ТС]     move семантика #6
Цитата Сообщение от Croessmah Посмотреть сообщение
http://www.cyberforum.ru/blogs/174410/blog826.html
Да не так как там написано.
Попробуйте вот выполнить такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include <iostream>
#include <string>
 
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    string s("aaa"), t("bbb");
    cout << s << endl;
    cout << t << endl;
    pair<string, string> p(std::move(s), std::move(t));
    cout << s << endl;
    cout << t << endl;
 
    return 0;
}
И объясните куда переезжают значения стрингов s и t.
Почему они теперь пустые. Это так и задумано?
Подозреваю, что если бы они были бы числового типа, то после такого в них были бы нули соответствующих типов.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 1
05.11.2012, 18:36     move семантика #7
Цитата Сообщение от ramybozy Посмотреть сообщение
И объясните куда переезжают значения стрингов s и t.
Почему они теперь пустые. Это так и задумано?
Подозреваю, что если бы они были бы числового типа, то после такого в них были бы нули соответствующих типов.
Тогда вот:
http://ru.wikipedia.org/wiki/C%2B%2B...e_semantics.29

Добавлено через 3 минуты
Цитата Сообщение от ramybozy Посмотреть сообщение
И объясните куда переезжают значения стрингов s и t.
Почему они теперь пустые. Это так и задумано?
C++
1
2
3
    pair<string, string> p(std::move(s), std::move(t));
    cout << p.first << endl;
    cout << p.second << endl;
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
05.11.2012, 18:39  [ТС]     move семантика #8
Да ну что вы по википедиям чего-то узнавать, это себя не уважать.

С вашис то кодом все понятно.
Что делать то с основополагающим принципом, когда мы взяли объявили две переменных, выделили для них память, а они потом взяли и таинственно исчезли?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 1
05.11.2012, 18:48     move семантика #9
Цитата Сообщение от ramybozy Посмотреть сообщение
С вашис то кодом все понятно.
Что делать то с основополагающим принципом, когда мы взяли объявили две переменных, выделили для них память, а они потом взяли и таинственно исчезли?
Цитата Сообщение от ramybozy Посмотреть сообщение
Да ну что вы по википедиям чего-то узнавать, это себя не уважать.
а там есть строчка:
конструктор переноса std::vector::vector(vector &&x) может просто перенести указатель и длину в новый объект, опустошив x.

Добавлено через 6 минут
И, если Вы проходили, по первой ссылке, которую я давал, там написано:
"Как видим, std::move не делает ничего, кроме преобразования типа. В этом и заключается особенность перемещения - мы лишь сигнализируем о том, что данные в объекте нам больше не нужны."
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
05.11.2012, 19:55  [ТС]     move семантика #10
Да это и в любой книжке написано.
Интересует другое, как трактовать ранее объявленные переменные s и t.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
05.11.2012, 22:05     move семантика #11
Цитата Сообщение от ramybozy Посмотреть сообщение
Интересует другое, как трактовать ранее объявленные переменные s и t.
21.4.2.2
basic_string(const basic_string<charT,traits,Allocator>& str);
basic_string(basic_string<charT,traits,Allocator>&& str) noexcept;

Effects: Constructs an object of class basic_string as indicated in Table 64. In the second form, str
is left in a valid state with an unspecified value
.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.12.2013, 12:23     move семантика #12
Цитата Сообщение от ramybozy Посмотреть сообщение
X& operator= (X&& rvalue); // move assignment operator
Ссылка на ссылку - это вообще что? И что за move assignment такой не понятный.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.12.2013, 13:10     move семантика #13
taras atavin, вот хорошая статья про ссылки на ссылки: «Универсальные» ссылки в C++11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2013, 14:17     move семантика
Еще ссылки по теме:

C++ Семантика перемещения - разобрать код
Что такое move семантика? C++
C++ Семантика перемещения rvalue\lvalue ссылок

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

Или воспользуйтесь поиском по форуму:
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
04.12.2013, 14:17     move семантика #14
Не используй move, и все у тебя будет нормально. Сам же указываешь ссылки на данные в s и t переместить в p.
А эта фишка, семантика перемещений, нехило так ускоряет работу при использовании временных объектов(к примеру, что из функции возвращается). Особенно когда при копировании объекта выделяется много памяти и происходит это часто.

Добавлено через 3 минуты
Цитата Сообщение от ramybozy Посмотреть сообщение
Что делать то с основополагающим принципом, когда мы взяли объявили две переменных, выделили для них память, а они потом взяли и таинственно исчезли?
Пиши не
C++
1
pair<string, string> p(std::move(s), std::move(t));
а
C++
1
pair<string, string> p(s, t);
Yandex
Объявления
04.12.2013, 14:17     move семантика
Ответ Создать тему
Опции темы

Текущее время: 19:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru