Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> r-value refs & move-semantics. что? как? для чего? 
V
    Опции темы
mes
Дата 13.4.2012, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Sahab @  13.4.2012,  19:25 Найти цитируемый пост)
 услышать материальное объяснение

состояние объекта после переноса неопределено.. 


--------------------
PM MAIL WWW   Вверх
Sahab
Дата 13.4.2012, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



Цитата(mes @  13.4.2012,  20:26 Найти цитируемый пост)
и следовательно состояние объекта корректно..


Цитата(mes @  13.4.2012,  20:29 Найти цитируемый пост)
состояние объекта после переноса неопределено..  


PM MAIL   Вверх
mes
Дата 13.4.2012, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Код

   x1.setValue(0.3);

Вы не то проверяете.. Вы проверяете физическую сущность объекта, а move изменяет состояние..

Добавлено через 1 минуту и 9 секунд
Sahab, в Вашем случае коректно.. но такое поведение не гарантированно, а следовательно может быть и подругому .. 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 13.4.2012, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



что я понял: move перемещает данные объекта, а следовательно - состояние.
то, что после перемещения, вызов X::print() не вызывает сегфолт - говорит лишь о том, что код не перемещается. оно и логично.
при чтении X::data сегфолт не происходит потому, что X::data после перемещения все равно на что-то указывает. на мусор на стеке, к примеру.

PM WWW   Вверх
mes
Дата 13.4.2012, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  13.4.2012,  19:50 Найти цитируемый пост)
что код не перемещается. оно и логично.

код никода не перемещается.. сегфолт происходит не из за какого то перемещения кода.. 
а из за за доступа к данным за пределами разрешений.. 




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 13.4.2012, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  13.4.2012,  20:59 Найти цитируемый пост)
сегфолт происходит не из за какого то перемещения кода.

я же так и написал.

Добавлено через 4 минуты и 30 секунд
ну...почти так smile

PM WWW   Вверх
mes
Дата 13.4.2012, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  13.4.2012,  20:07 Найти цитируемый пост)
я же так и написал.
может быть.. я не понял при чем во фразе "код", поэтому и уточнил.. 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 13.4.2012, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  13.4.2012,  21:13 Найти цитируемый пост)
я не понял при чем во фразе "код"

ну как же.. вызов функции это: 1)сохранение стека, 2)call, и т.д..
т.е. если бы перемещение так же бы и переносило и код вызова, то тогда бы точно получали сегфолт.

этим я всего лишь хотел сказать то, что успешный вызов X::print() без сегфолта - не показатель того что объект небыл перемещен. собственно, как и чтение переменной в которой до перемещения располагались данные.

PM WWW   Вверх
mes
Дата 13.4.2012, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  13.4.2012,  20:33 Найти цитируемый пост)
т.е. если бы перемещение так же бы и переносило и код вызова,

 smile, ну пусть так.. тогда вопрос .. а если не переносит код ,то сегфолт невозможен ?!




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 13.4.2012, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  13.4.2012,  21:38 Найти цитируемый пост)
а если не переносит код ,то сегфолт невозможен ?

возможен. но прежде чем получить сегфолт при доступе к "висячим" данным, нужно произвести вызов X::print(). я же об этом и говорил. а т.к. код не переносится, то и при перенесенном объекте вызов всегда будет успешным. а вот получим ли мы сегфолт при чтении данных - это уже другой вопрос.

PM WWW   Вверх
bsa
Дата 13.4.2012, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Что вы тут спорите? move-семантика нужна в таких случаях, когда именно перемещение и необходимо. Для простых POD типов она смысла не имеет. А вот для контейнеров самое то. Потому что контейнер содержит несколько указателей. move-конструктор (например) копирует ЗНАЧЕНИЯ этих указателей в новый объект, а в старом (который передается как rvalue) их зануляет. Таким образом, деструктор старого объекта ничего не освободит, и новый объект будет существовать как ни в чем ни бывало. Это просто более быстрый вариант по сравнению с shared_ptr/array при использовании в таких ситуациях.
PM   Вверх
volatile
Дата 13.4.2012, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(boostcoder @  13.4.2012,  21:33 Найти цитируемый пост)
если бы перемещение так же бы и переносило и код вызова, то тогда бы точно получали сегфолт.

boostcoder, код вообще никогда не переносился, не переносится, и не будет переносится. 
Он один для всех объектов. 
Перенесение кода это не С++, более того, я даже не знаю, есть ли вообще в природе язык, где код переносится с экземпляром объекта.
PM MAIL   Вверх
bsa
Дата 13.4.2012, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(volatile @  14.4.2012,  00:52 Найти цитируемый пост)
Перенесение кода это не С++, более того, я даже не знаю, есть ли вообще в природе язык, где код переносится с экземпляром объекта. 

это не от языка зависит. А от программиста. Если очень захотеть, то можно это сделать. По крайней мере на платформах, где нет защиты от выполнения кода в области данных.
PM   Вверх
volatile
Дата 14.4.2012, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



bsa, я имел ввиду объекто-ориентированный аспект.
само перенесение кода, конечно возможно (хотябы в обычных exe-упаковщиках)
Это другое.

PM MAIL   Вверх
boostcoder
Дата 14.4.2012, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



volatile, я не говорил что код переносится. я лишь пытался прояснить это:

Цитата(mes @  13.4.2012,  19:55 Найти цитируемый пост)
Цитата(Sahab @  13.4.2012,  18:23 )
Можно ли пользоваться исходным объектом (откуда перемещали) после его перемещения?

нельзя

Цитата(Sahab @  13.4.2012,  18:23 )
  X x2=std::move(x1);
   x1.print();
   x2.print();

Логика проверки существования значения, путем вывода его в корне не верна.. 


PM WWW   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0951 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.