![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
wladF |
|
||||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 2.6.2009 Репутация: нет Всего: нет |
Всем привет.
В Интернете можно найти множество различных примеров использования данного нововведения в C++11, но практически все они сводятся к такому коду:
Зачем нужна была здесь семантика переноса, если, грубо говоря, кроме как другого имени переменной мы не получили? Т.е. мы могли бы сделать, что-то типа:
Либо просто дальше использовать "a", не создавая других переменных. Это сообщение отредактировал(а) wladF - 3.3.2013, 08:00 |
||||
|
|||||
NoviceF |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: нет Всего: 2 |
Безотносительно данного примера, move семантика, например, даёт возможность использования умных указателей без подсчёта ссылок и с семантикой передачи владения (а-ля auto_prt) в контейнерах STL, пример - unique_ptr (с ограничениями на копирование).
http://stackoverflow.com/questions/2876641...stl-collections |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Этот пример сам по себе не очень хорош, но его можно легко дополнить:
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Мое IMHO - это было сделано для ускорения контейнелов, которые могут перемещать хранимые объекты в процессе своей жизни (std::vector например). Если vector делает resize, то без move семнтики его элементов, ему придется для каждого своего элемента позвать copy конструктор (для нового елемента), а потом деструктор (для старого), и то и другое может быть весьма дорого. При наличии move семантики будет вызван move constructor (что должно быть дешево) и деструктор для пустого элемента (что так же должно быть дешево)
|
|||
|
||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Из FAQ'а Страуса. (вольный перевод)
Старый своп.
Теперь представим что мы вызываем его для двух строк, размером по мегабайту. string str1 = "Очень длинная строка1 ....."; string str2 = "Очень длинная строка2 ....."; swap (str1, str2); Здесь нам понадобицца дополнительная память в 1 мегабайт, плюс время для копирования 3 мегабайт. Идеальный своп
|
||||
|
|||||
Acer |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: нет Всего: 8 |
Для улучшения скорости этот пример бессмыслен, так как push_back тормозит, даже если сделать reserve() Лучше уж так:
Ps
Это сообщение отредактировал(а) Acer - 8.3.2013, 15:35 |
||||||||
|
|||||||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Несколько раз подряд делать move для одной и той же переменной - это разве правильно? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
Acer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: нет Всего: 8 |
||||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
При resize будут вызваны дефолтные конструкторы для добавляемых объектов. (абсолютно лишняя операция, потому-что их сразу следом затрут) При пуш-бэке дефолтные конструкторы вызваны не будут, а сразу объект будет перемещен на нужное место. Сам пуш-бэк, при предварительном резерве, приктически ничо не стоит. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |