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

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

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

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

05.11.2012, 17:24. Просмотров 3355. Ответов 13
Метки нет (Все метки)

Сейчас стало появляться нечто вроде такого:

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
};
Сразу вот непонятно в чем тут фишка и для чего это нужно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2012, 17:24     move семантика
Посмотрите здесь:

Что такое move семантика? - C++
Что такое move семантика? Добавлено через 6 минут Я правильно понимаю, что mov присваивание перемещает правый операнд на место...

Move семантика (класс полиномов) - C++
Доброго времени суток. Пишу простенький класс полиномов, в котором есть единственное приватное поле - это map. Вот думаю надо ли писать...

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

Семантика массивов char. - C++
Добрый день. Мы все знаем, что в C и С++ создав два массива подрят.. запросив элемент привышающий размерность первого мы зайдем во второй....

Синтаксис и семантика блоков try… catch… - C++
Не могу понять что нужно написать

Семантика перемещения и perfect forwarding - C++
Спасибо автору статьи http://www.cyberforum.ru/blogs/174410/blog826.html Но не понял кое что. А именно этот кусок. Прошу объяснить тех...

Семантика перемещения - разобрать код - C++
Допустим, есть такой код: vector<T> f() { vector<T> v(100000); return v; } ... vector<T> t =...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
05.11.2012, 17:26     move семантика #2
Уже гуглили на эту тему или закидать вас ссылками?
Если коротко, то move быстрее, чем copy
DiffEreD
1429 / 766 / 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
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 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
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
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
Ушёл с форума.
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
1429 / 766 / 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 семантика
Еще ссылки по теме:

Семантика перемещения rvalue\lvalue ссылок - C++
Здравствуйте форумчани. Объясните пожалуйста процессы происходящии внутрии функции swap принимающую rvalue аргументы: Код программы:...

Лексема,Синтаксис и Семантика данного выражения. - C++
помогите разобрать данное выражение. int * m = new int что каждое из них означает,что означает int, * , m , = , new , int , нужно...

Std::move - C++
Добрый вечер, #include &lt;iostream&gt; using namespace std; class A { private: int x = 10; public: A(int q){ x = q; }

Move semantics в C++11 - C++
1. как вообще читать &amp;&amp; ? ссылка на ссылку? как это работает? 2. в одном контейнере могут быть и copy и move конструкторы? а как тогда...

std::move() - C++
Есть ли разница между следующими вещами: A = std::move(B); // and std::copy(B.begin(), B.end(), A.begin()); B.clear();


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

Или воспользуйтесь поиском по форуму:
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 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 семантика
Ответ Создать тему
Опции темы

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