Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > C++11 move семантика |
Автор: wladF 3.3.2013, 07:57 | ||||
Всем привет. В Интернете можно найти множество различных примеров использования данного нововведения в C++11, но практически все они сводятся к такому коду:
Зачем нужна была здесь семантика переноса, если, грубо говоря, кроме как другого имени переменной мы не получили? Т.е. мы могли бы сделать, что-то типа:
Либо просто дальше использовать "a", не создавая других переменных. |
Автор: NoviceF 3.3.2013, 09:15 |
Безотносительно данного примера, move семантика, например, даёт возможность использования умных указателей без подсчёта ссылок и с семантикой передачи владения (а-ля auto_prt) в контейнерах STL, пример - unique_ptr (с ограничениями на копирование). http://stackoverflow.com/questions/2876641/so-can-unique-ptr-be-used-safely-in-stl-collections |
Автор: JackYF 3.3.2013, 14:55 | ||
Этот пример сам по себе не очень хорош, но его можно легко дополнить:
|
Автор: xvr 4.3.2013, 13:54 |
Мое IMHO - это было сделано для ускорения контейнелов, которые могут перемещать хранимые объекты в процессе своей жизни (std::vector например). Если vector делает resize, то без move семнтики его элементов, ему придется для каждого своего элемента позвать copy конструктор (для нового елемента), а потом деструктор (для старого), и то и другое может быть весьма дорого. При наличии move семантики будет вызван move constructor (что должно быть дешево) и деструктор для пустого элемента (что так же должно быть дешево) |
Автор: volatile 5.3.2013, 00:00 | ||||
Из FAQ'а Страуса. (вольный перевод) Старый своп.
Теперь представим что мы вызываем его для двух строк, размером по мегабайту. string str1 = "Очень длинная строка1 ....."; string str2 = "Очень длинная строка2 ....."; swap (str1, str2); Здесь нам понадобицца дополнительная память в 1 мегабайт, плюс время для копирования 3 мегабайт. Идеальный своп
|
Автор: Acer 8.3.2013, 14:32 | ||||||||
Для улучшения скорости этот пример бессмыслен, так как push_back тормозит, даже если сделать reserve() Лучше уж так:
Ps
|
Автор: feodorv 8.3.2013, 14:56 |
Несколько раз подряд делать move для одной и той же переменной - это разве правильно? |
Автор: Acer 8.3.2013, 15:30 | ||
Нет. Ошибся. Пусть будет там a[i], например |