|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||||||
Десятая попытка понять std::move14.07.2023, 17:11. Показов 1604. Ответов 9
Здравствуйте,
Пытаюсь понять в 10ый раз, что же делает std::move и как работает. Концепцию rvalue ссылок я так понять и не смог, так как безнадежно туп. Но вот на таком простом примере:
Что будет после вызова std::move(my_struct_value_) ? В векторе выделится память и просто построится объект структуры ? Если да, то чем это отличается от emplace_back() ? Ведь копирование все равно произошло или нет ? То есть я имею виду, когда я создал объект my_struct_value_ - он в условной "куче" стал занимать место, когда я сделал push_back в векторе и std::move(my_struct_value_), то по простому вызвался memcpy() и байты из памяти которая выделена под my_struct_value_ были просто перекопированы в новую память, которая выделилась в векторе, и сама память под my_struct_value_ никуда не делась, просто часть или все поля структуры занялись и я теперь не могу к ним обращается. Или же происходит что то другое ?
0
|
||||||
| 14.07.2023, 17:11 | |
|
Ответы с готовыми решениями:
9
std::move() std::move в Си |
|
Вездепух
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,231
|
|||||||
| 14.07.2023, 17:33 | |||||||
Сообщение было отмечено Optimus11 как решение
Решениеstd::move(my_struct_value_) не будет ничего. std::move - это просто static_cast. Он ничего физически не делает.Результатом этого std::move будет безымянное my_struct_value&&. Далее overload resolution выберет соответствующую версию push_back и вызовет ее. А она уже внутри себя при конструировании нового элемента вектора снова сделает std::move. В результате этого, overload resolution для конструирования нового элемента вектора выберет ваш конструктор my_struct_value(my_struct_value&& other).Вот и все. std::move.my_struct_value(my_struct_value&& other) для конструирования нового элемента. На этом роль std::move закончилась. А дальше произойдет то, что вы сами руками написали внутри my_struct_value(my_struct_value&& other). Напишете копирование - будет копирование. Да, произошло копирование, потому что вы сами руками написали там копирование.Сколько раз уже дылдонили: в ядре языка С++ нет никакой "семантики перемещения". Никакого "перемещения" язык сам по себе делать не умеет. В ядре языка есть только &&-ссылки и правила overload resolution для них. Все остальное, т.е. "семантику перемещения", вам придется писать вручную. Что напишете - то и получите. Вы написали "семантику перемещения" которая делает копирование - вот и получилось копирование. memcpy? Откуда вы взяли такую чушь? Где у вас в коде memcpy?
2
|
|||||||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
|||
| 14.07.2023, 17:53 [ТС] | |||
|
Добавлено через 1 минуту
0
|
|||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|
| 14.07.2023, 17:57 | |
|
Optimus11, к теме , про RVO не слышал ?
0
|
|
|
Вездепух
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,231
|
||||||||
| 14.07.2023, 18:50 | ||||||||
|
Можно было написать некое "перемещение". Но что такое "перемещение" для вашего класса зависит от задуманной вами семантики вашего класса. Я не знаю, что вы вам задумали за семантику вашего класса. Я не знаю, что значат хранящиеся в нём значения. Я не знаю, как он может/должен "перемещаться". Только вы это знаете. Например, что это за указатели
Если ни одно из полей вашего класса не имеет семантики владения каким-то ресурсом, то тогда ничего другого и нельзя написать. Для вашего класса семантика перемещения совпадает с семантикой копирования. Добавлено через 50 минут Вы же говорите о копировании, к которому сверху добавлено еще некое дополнительное действие - "зануление". Зачем? Лишнее действие понизит эффективность кода, а не повысит ее.
1
|
||||||||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||
| 14.07.2023, 19:07 [ТС] | ||
|
Я правда так и не понял зачем придумали вводящее в заблуждение неокрепшие умы такие как мой - слово "перемещение". По факту, опять такие если я правильно понял - всегда происходит копирование, да будет происходить, то, что я напишу в конструкторе "перемещения" - но по факту - это копирование. Вопрос только в том, что копируется - только условная ссылка/указатель на ресурсы или копируется все. То есть, опять такие, если я правильно понял, то std::move - это как бы просто удобная условно обертка над копирование указателей на выделенные ресурсы. Ну или же я опять ничего не понял.
1
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 14.07.2023, 20:09 | |
|
Optimus11, стратегии владения ресурсом и стратегии передачи владения, вот что здесь важно. Зачем концентрироваться на копировании? Это все равно что сказать "дом - это всего лишь забитые гвозди в правильные места", "но по факту дом - это забитые гвозди". Где-то да, но кому это интересно? Важно то, что получается в итоге. В смысле, гвозди не важны, важен дом в целом. Так и тут, копирование не важно, важно то, что вы получаете в итоге. А получаете вы возможность описывать порядок передачи владения ресурсом. Инструмент, с помощью которого вы получаете возможность использовать естественные ситуации, происходящие с вашими объектами (создание, передача, уничтожение) для управления владением. Понимаете?
3
|
|
|
фрилансер
6461 / 5667 / 1130
Регистрация: 11.10.2019
Сообщений: 15,082
|
||
| 14.07.2023, 20:17 | ||
Сообщение было отмечено Optimus11 как решение
Решение1) "копирование" - создание в новом объекте места для данных, затем заполнение этого места копией данных из источника. Источник остаётся в прежнем состоянии. 2) "перемещение" - судьба источника никого не волнует. Разрешено отобрать все ресурсы у источника (например, скопировать только указатели на уже выделенную внутреннюю память). Но при этом нужно обеспечить адекватное, не поломанное, состояние источника - то есть, внутри источника эти указатели обнулить, например. Если после перемещения произойдёт работа с источником, ничего не должно сломаться, но при этом новое содержимое источника в общем случае неизвестно (точнее - поведение можно вычитать из документации) 1 и 2 - это общее, всеми ожидаемое поведение. Но всё же никто не запрещает реализовать эти два поведения иначе
2
|
||
|
Вездепух
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,231
|
|||||
| 14.07.2023, 20:50 | |||||
std::string или std::vector. Для них семантика перемещения сильно отличается от семантики копирования. О каком "по факту это копирование" может идти речь?Во-вторых, одним из жизнеспособных вариантов реализации семантики перемещения является swap полей класса. В этом случае "по факту" будет обмен, а не копирование. Можно, наверное, напридумывать еще вариантов. std::move - это лишь способ заставить компилятор выбрать и вызвать функцию с параметром типа &&-ссылка. А что произойдет дальше зависит только от того, что написано внутри этой функции.
1
|
|||||
|
Комп_Оратор)
|
|||
| 14.07.2023, 21:35 | |||
|
Optimus11, ваша трудность состоит именно в том, что вы Тема перемещения не лёгкая тема. С наскоку не выйдет. Разберитесь с категориями выражений и ссылками. Пока там темно, перемещение не сдвинется с места.
1
|
|||
| 14.07.2023, 21:35 | |
|
Помогаю со студенческими работами здесь
10
std::move()
Функция std::move()
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|