6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 83
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
C++11 Конструктор перемещения05.08.2016, 14:05. Показов 3350. Ответов 9
Метки нет Все метки)
(
Добрый день. Решил тут познакомится с конструктором перемещения, и сразу протестировал кое-что.
Конструктор перемещения просто изымает данные из аргумента и передает в объект который вызвал этот коструктор, для этого используют rvalue ссылку. Но ведь подобного можно добиться и с простой ссылкой. Вот пример:
П.С. Компилятор - MinGW 4.9.2, среда - Qt Creator 4.0.1
0
|
|
05.08.2016, 14:05 | |
Ответы с готовыми решениями:
9
Конструктор перемещения
|
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
|
|
05.08.2016, 14:37 | 2 |
![]() Решение
TheThe, в конструктор копирования передается ссылка на константу, у вас просто ссылка. Вы не сможете воспользоваться обычным конструктором копирования при инициализации нового объекта константным или временным объектом.
Добавлено через 6 минут Для инициализации константным объектом в конструкторе аргумент нужно объявлять как ссылку на константу. Но тогда вы не сможете "переместить" данные, а только можно скопировать. То же самое будет касаться и временных объектов. Вы не сможете в них переместить данные с помощью конструктора копирования. Поэтому был введен конструктор перемещения. Плюс конструктор перемещения используется для инициализации объектами, которые больше не нужны (с помощью std::move, который вы продемонстрировали в примере).
1
|
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
|
|
05.08.2016, 14:55 | 3 |
![]() Решение
старый auto_ptr так и был реализован, через конструктор копирования и пару оберток
с самого начала до 3:30 он объясняет как это было, а потом говорит, чем такой подход плох.
2
|
rikimaru2013
|
05.08.2016, 16:47
#4
|
Не по теме: Babysitter, вот это он волосатый!!! =-O
0
|
Babysitter
|
05.08.2016, 17:30
#5
|
Не по теме: rikimaru2013, "hacker long hair" +5 int and +5 wisdom
0
|
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 83
|
||||||
05.08.2016, 19:19 [ТС] | 6 | |||||
Babysitter, Спасибо за видео.
Добавлено через 21 минуту Babysitter, Т.е. если я правильно понял, то.
0
|
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
|
||||||
05.08.2016, 19:39 | 7 | |||||
![]() Решение
ага, теперь все, у чего есть дешевый мув можно и нужно возвращать из функции по значению.
всем показывают код вроде этого, а потом говорят скомпильте дважды с -std=c++98 и -std=c++11 и посмотрите как быстро будут работать эти программы.
2
|
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 83
|
|
05.08.2016, 19:47 [ТС] | 8 |
Babysitter, теперь понятнее, спасибо!
0
|
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
|
|
05.08.2016, 19:55 | 9 |
TheThe, последнее - в старых компиляторах были такие оптимизации, назывались rvo/nrvo. так вот они иногда делали по сути тоже самое, что делает мув семантика на уровне языка. если хочешь реально провести этот опыт и увидеть большую разницу, то нужно отключить эти оптимизации флагом компилятора, в гцц -fno-elide-constructors
1
|
05.08.2016, 20:09 | 10 |
Не тоже самое, т.к. copy elision/rvo/nrvo вообще ничего не вызывает в плане копирования/перемещения и плюет на сайд эффекты.
Они и сейчас есть. Эти оптимизации эффективнее, чем перемещение. Добавлено через 2 минуты TheThe, как раз сейчас пишу блог о семантике перемещения. Пока скудно, но уже что-то есть. Когда будет готово - не знаю, хотя могу опубликовать и уже потом "допиливать" потихоньку.
2
|
05.08.2016, 20:09 | |
Помогаю со студенческими работами здесь
10
Конструктор перемещения и оптимизация
Не работает конструктор перемещения (C++11) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |