Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::move: когда стоит "воровать" локальные переменные / 7 сообщений из 7, страница 1 из 1
24.11.2015, 22:11
    #39112700
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::move: когда стоит "воровать" локальные переменные
Собственно, с появлением move-семантики стали доступны вот такие вещи:

Код: plaintext
1.
2.
3.
4.
5.
6.
vector<int> f(){
   vector<int> i;
   i.reserve(1000000);
   // do some
  return std::move(i);
}



Мне, правда, не до конца понятно, когда эти имеет смысл делать, и имеет ли вообще. Кто что по этому поводу думает?
...
Рейтинг: 0 / 0
24.11.2015, 22:14
    #39112704
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::move: когда стоит "воровать" локальные переменные
гы :) профилировщик ответит :)

главное понять: после std::move нельзя использовать перемещенную переменую.

std::move может существенно ускорить работу. если писать классы, указывать констуктор перемещения и присваивание.
...
Рейтинг: 0 / 0
24.11.2015, 22:49
    #39112722
YesSql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::move: когда стоит "воровать" локальные переменные
BagaBagaСобственно, с появлением move-семантики стали доступны вот такие вещи:

Код: plaintext
1.
2.
3.
4.
5.
6.
vector<int> f(){
   vector<int> i;
   i.reserve(1000000);
   // do some
  return std::move(i);
}



Мне, правда, не до конца понятно, когда эти имеет смысл делать, и имеет ли вообще. Кто что по этому поводу думает?
В данном случае move ненужен. Сработает NRVO . Если уж хочешь с move тогда функция должно выглядеть
так:

Код: plaintext
1.
vector<int>&& f();


и в общем случае возвращаемый обьект должен поддерживать move
...
Рейтинг: 0 / 0
24.11.2015, 23:00
    #39112726
Alex the coder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::move: когда стоит "воровать" локальные переменные
BagaBaga,

здесь вот хорошо расписано - http://stackoverflow.com/a/14856553/1794089
Гугл-фу решает :)
Как я понимаю, std::move нужен для lvalue-переменных, т.е. в твоем случае был бы нужен (если забыть про NRVO, как подметили выше).
Написал бы return vector<int>(); - то точно не нужен.
На тему когда надо вообще думать о move - это когда перемещать объекты дешевле, чем их копировать. Вектор внутрях - это тупо указатель и int с размером, в общем случае.
move поменяет местами два указателя и два int. copy-конструктор же будет долго и мучительно копировать всё содержимое массива.
А если в классе 100500 полей простых типов, то еще не факт, что быстрее получится.
Как-то так :)
...
Рейтинг: 0 / 0
25.11.2015, 10:17
    #39112878
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::move: когда стоит "воровать" локальные переменные
В качестве "итого":
RVO "дешевле" std::move. Лучше полагаться на него, если компилятор его поддерживает.
std::move "дешевле" копирования. На классах, поддерживающих move-семантику.
Использование std::move мешает RVO, т.к std::move - приведение типа.
...
Рейтинг: 0 / 0
25.11.2015, 10:21
    #39112881
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::move: когда стоит "воровать" локальные переменные
YesSqlЕсли уж хочешь с move тогда функция должно выглядеть
так:

Код: plaintext
1.
vector<int>&& f();


и в общем случае возвращаемый обьект должен поддерживать move

Синтаксически это правильно. Но выглядит подозрительно, т.к. && - это ссылка, и в моём примере это получится на локальный объект. В общем, не рискну. А вот так - вполне, от чего бы и нет
Код: plaintext
1.
2.
3.
T&&    f(T&& t){
                       return std::move(t);
          }
...
Рейтинг: 0 / 0
25.11.2015, 14:14
    #39113136
Westtrd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::move: когда стоит "воровать" локальные переменные
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::move: когда стоит "воровать" локальные переменные / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]