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

Поиск:

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


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


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

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



Цитата(borisbn @  9.11.2011,  18:04 Найти цитируемый пост)
Что я не так делаю...

компилятор позволяет себе не переносить из временого в целевой, а сразу использовать целевой объект для результата..
если нужно задействовать именно move -семантику в вашем случае, укажите это с помощью move();

Добавлено через 1 минуту и 20 секунд
Цитата(borisbn @  9.11.2011,  18:04 Найти цитируемый пост)
 Там создаётся 4 объекта

это по старым правилам smile



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


Эксперт
****


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

Репутация: 32
Всего: 101



Цитата(borisbn @  9.11.2011,  19:04 Найти цитируемый пост)
Там создаётся 4 объекта (x, y, x и result внутри operator+), а вызывается 3 деструктора. Как это ?

там всего три объекта, погляди на адреса. result и z одно и то же.

что бы он вызвался, укажи семантику явно 
Код

Str z( move(x + y) );


Добавлено через 4 минуты и 18 секунд
Цитата(baldina @  9.11.2011,  19:32 Найти цитируемый пост)
result и z одно и то же.

это NRVO отработало. велик могучий языка...

Добавлено через 6 минут и 1 секунду
оказывается уже ответили((
PM MAIL   Вверх
borisbn
Дата 9.11.2011, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 22
Всего: 135



mesbaldina, спасибо за ответы, но
1) я хочу, чтобы move-конструктор вызывался автоматически, поэтому не хочу использовать std::move()
2) boostcoder говорит, что на LWS оптимизация выключена, а вы говорите, что
Цитата(mes @  9.11.2011,  19:24 Найти цитируемый пост)
компилятор позволяет себе не переносить из временого в целевой, а сразу использовать целевой объект для результата.

Цитата(baldina @  9.11.2011,  19:32 Найти цитируемый пост)
result и z одно и то же.

или это не имеет отношения к оптимизации ?
тогда вопрос снят


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 9.11.2011, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(borisbn @  9.11.2011,  18:40 Найти цитируемый пост)
или это не имеет отношения к оптимизации ?

не имеет, это не оптимизация, а перенос при инициализации.. 

некий аналог этому из недалекого прошлого :
Код

Str str = Str ("any");

так же создается только один объект..

Цитата(borisbn @  9.11.2011,  18:40 Найти цитируемый пост)
я хочу, чтобы move-конструктор вызывался автоматически, поэтому не хочу использовать std::move()

делайте перенос не при инициализации, а при присвоении..

Это сообщение отредактировал(а) mes - 9.11.2011, 19:46


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


found myself
****


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

Репутация: 20
Всего: 121



Цитата(azesmcar @ 9.11.2011,  10:10)
Например:
Код

#include <algorithm>

class X
{
private:
   int* data;
public:
   X():
      data(new int[1000000]) {}
   ~X()
   {
      delete data;
   }
   X(const X& other):
      data(new int[1000000])
   {
      std::copy(other.data,other.data+1000000,data);
   }
   X(X&& other):
      data(other.data)
   {
      other.data=0;
   }
};

int main()
{
   X x1;
   X x2=std::move(x1);
}

http://liveworkspace.org/code/4baf51d7d55a...835aad73d11a085

Объект перемещается, т.е. все данные переместились в другой объект, в данном случае деструктор сделает delete 0 и успокоится.
Что делает деструктор и конструктор перемещения решает программист.

Это получается как только я вызвал move constructor я уже объектом больше пользоваться не могу потому что данные были перемещены? Разве это не ведёт к понтенциальным ошибкам? Т.е. я должен теперь "запомнить", что объект был перемещён и больше его не трогать.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
boostcoder
Дата 5.3.2012, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(W4FhLF @  5.3.2012,  14:13 Найти цитируемый пост)
я уже объектом больше пользоваться не могу потому что данные были перемещены?

угу.

Цитата(W4FhLF @  5.3.2012,  14:13 Найти цитируемый пост)
Разве это не ведёт к понтенциальным ошибкам?

move-semantic довольно редко используется, в особых случаях. или же с временными объектами.
посему, потенциально не сильно увеличивает вероятность ошибок.

Это сообщение отредактировал(а) boostcoder - 5.3.2012, 16:15
PM WWW   Вверх
bsa
Дата 5.3.2012, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(W4FhLF @  5.3.2012,  15:13 Найти цитируемый пост)
Т.е. я должен теперь "запомнить", что объект был перемещён и больше его не трогать. 

объект, который подпадает под rvlaue-reference по любому ты использовать больше не сможешь. В простом случае, это правая часть выражения: a = c + b. Ты по любому после присваивания не сможешь воспользоваться временным объектом.
А если у тебя остаются возможности им воспользоваться, то он не является rvalue и, соответственно, не подпадает под действие перемещающего конструктора.
PM   Вверх
Sahab
Дата 13.4.2012, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Можно ли пользоваться исходным объектом (откуда перемещали) после его перемещения?

http://liveworkspace.org/code/3c9358e9ddae...fd6df109b6ea1cd

Код

#include <algorithm>
#include <iostream>

class X
{
private:
   int* data;
public:
   X():
      data(new int[1000000]) {
            std::cout << "сtor()" << std::endl;
      }
   ~X()
   {
      std::cout << "~dtor()" << std::endl;
      delete data;
   }
   
   void print() {
      std::cout << this << ", " << &data[0] << std::endl;
   }
   
   X(const X& other):
      data(new int[1000000])
   {
      std::cout << "copy()" << std::endl;
      std::copy(other.data,other.data+1000000,data);
   }
   X(X&& other):
      data(other.data)
   {
      std::cout << "rcopy()" << std::endl;
      other.data=0;
   }
};

int main()
{
   X x1;
   X x2=std::move(x1);
   x1.print();
   x2.print();
}


Цитата

сtor()
rcopy()
0xbff6727c, 0
0xbff67278, 0xb6ab0008
~dtor()
~dtor()

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


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


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

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



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

нельзя

Цитата(Sahab @  13.4.2012,  18:23 Найти цитируемый пост)
  X x2=std::move(x1);
   x1.print();
   x2.print();

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



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


pattern`щик
****


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

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



Цитата(mes @  13.4.2012,  19:55 Найти цитируемый пост)
проверки существования значения, путем вывода его в корне не верна

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

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


Бывалый
*


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

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



Цитата(mes @  13.4.2012,  19:55 Найти цитируемый пост)
Логика проверки существования значения, путем вывода его в корне не верна.. 

Я предполагал segfault, именно это я проверял, а не вывод и его значение.

Добавлено через 38 секунд
Цитата(boostcoder @  13.4.2012,  20:16 Найти цитируемый пост)
или разница в том что X::print() это код, а X::data - данные?

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


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


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

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



Цитата(boostcoder @  13.4.2012,  19:16 Найти цитируемый пост)
но...раз объекта не существует, то при вызове X::print() разве не должен произойти сегфолт? 

объект  (this) существует .. move не трогает сами объекты, а переносит их содержимое smile

кстати в приведенном последнем примере, print демонстриует состояние, а не использует его.. так что по сути все правильно работает smile





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


Бывалый
*


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

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



Цитата(mes @  13.4.2012,  19:55 Найти цитируемый пост)
нельзя

Я это и предполагал, хотел просто услышать материальное объяснение. 
PM MAIL   Вверх
mes
Дата 13.4.2012, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Sahab @  13.4.2012,  19:22 Найти цитируемый пост)
Проверял и с данными, сегфолта нет. 

потому что ваш move-ctor обнуляет указатель на данные, и следовательно состояние объекта корректно..



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


Бывалый
*


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

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



http://liveworkspace.org/code/c581e966af26...b39b963508fd5e4


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

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

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

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

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


 




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


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

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