|
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
|
||||||
Как передается значение в функцию и почему после перемещения знач. остается?14.07.2019, 23:05. Показов 1830. Ответов 10
Метки нет (Все метки)
Для меня это очень странный вопрос, т.к. не сказал бы что я уже профи в С++(да куда там...
), но вроде и не совсем новичок. И настиг такой вопрос: Вот глянул про новый(относительно) стандарт C++11 с rvalue, lvalue, про функцию std::move() также узнал. Немного о том, как я понял: lvalue - то что имеет какое-то выделенное место в памяти(объявленная переменная, объявленный объект итд); rvalue - то, что живет "моментом"(наши "волшебные" цифры, н-р: int y = 2/*волшебное число*/, или такие же строки итд). Вот немного разобравшись, что это всё означает, как работает, в том числе и функция std::move(),, глянул какие параметры она принимает(функция), а именно - (_Ty&& _Arg). И здесь произошла небольшая коллизия в моей голове. Сразу пример кода:
), но по факту, в коде, который у меня работает(выше) мы передаем lvalue(моя строка s) - но почему так? Как оно вообще заработало? Он требует передать rvalue(_Ty&&_Arg) но мы передаем lvalue - и оно работает!? Как, почему?2) И еще один вопрос: по идее, при перемещении(как написано в описании функции, в разных видео с ютюба, где люди объясняют работу std::move(), да и с названия понятно) мы должны что-то перемещать(не копировать). То есть, объект был(в моем случае строка "smth") по адресу 500(например), потом я его от туда взял, и переместил на адрес п-ра моей функции, например 1000(адрес). Значит на адресе 500 - ничего не должно быть, а на 1000 - должен быть мой объект. А оно почему то так не работает, т.к. после прохода функции строка остается - почему так?? Она же должная "улететь" в функцию, по идее.
0
|
||||||
| 14.07.2019, 23:05 | |
|
Ответы с готовыми решениями:
10
Почему не передается массив в качестве параметра в функцию? Почему не передается значение input |
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||||||||
| 14.07.2019, 23:52 | |||||||||
Сообщение было отмечено MJ_PRUTYG как решение
Решениеs нужно рассматривать как rvalue. Это и делает move, т.е. всего лишь меняет категорию выражения, сам по себе он ничего не перемещает (да и некуда, там же просто ссылка).Фактическое перемещение выполнил бы конструктор перемещения или оператор перемещения, но у вас они в коде не задействованы. Кликните здесь для просмотра всего текста
Читайте про свертку ссылок.
2
|
|||||||||
|
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
|
|||||||
| 15.07.2019, 08:55 [ТС] | |||||||
|
DrOffset, спасибо большое за объяснение и за ссылку на статью. За конструктор перемещения не подумал - забыл - это похоже и есть ответ на один из моих вопросов.
А вот книгу Кормена про алгоритмы, которую вы мне посоветовали - просто божественная находка для меня! Темы между собой не переплетены, что-то конкретное нужно узнать - переходишь на конкретную страницу...идеально! Вот была бы такая же книга, но по С++... Ехх... Может вы знаете какую-нибудь? Добавлено через 5 часов 38 минут DrOffset, воот, в 8 утра только закончил разбираться со всем этим(спасибо еще раз за ссылку, которую вы мне сбросили - от туда всё черпал). И остался главный и единственный(надеюсь) вопрос: по факту, std::move просто приводит & или && к rvalue, но почему же это называется перемещением(если значения в изначальном объекте остаются) и почему это быстрее - главный вопрос? Вот создал в учебных целях пример:
0
|
|||||||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
||
| 15.07.2019, 10:26 | ||
|
MJ_PRUTYG, как уже сказали
std::move на самом деле ничего не перемещает, а лишь делает каст к r-value, о нем лучше думать как о rvalue_cast() ф-и.Почему перемещение быстрее копирования? Все просто, потому что rvalue это по сути временный объект, который через секунду умрет, а значит мы можем "своровать" его данные, терять ему уже и так нечего, но это не сработает с фундаментальными и/или простыми (pod) классами, тк они фундаментальные, операции над ними может легко проводить сам процессор и оптимизировать компилятор, а pod'ы спокойно зачастую можно целиком загнать в регистр, поэтому здесь выиграша от перемещения в сравнении с копированием не будет.Что касаемо «сложных» классов, например std::string, то здесь перемещение имеет смысл и роль перемещения выполняет соответствующий конструктор. И быстрее это будет как минимум из-за того, что не надо делать дополнительных выделений в куче как в случае с копированием, а можно просто украсть указатель))Добавлено через 8 минут Вернее, не то, что выиграша в перемещении фундаментальных типов не будет, а вообще, в целом, перемещение для фундаментальных типов не работает, там попросту нечего воровать, поэтому в int и остаются данные.Добавлено через 11 минут c константным временным объектом?Как вы тогда будете пытатся переместить (своровать) данные, даже если он умрет на следующей инструкции? Вы же понимаете, что такой объект может быть помещен в ro-data сегменте, а const_cast к таким данным приведет к UB.
1
|
||
|
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
|
||
| 15.07.2019, 10:31 [ТС] | ||
|
Спасибо за ответ, но...
0
|
||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|||||||||
| 15.07.2019, 10:40 | |||||||||
1
|
|||||||||
|
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
|
|
| 15.07.2019, 10:59 [ТС] | |
|
Azazel-San, всё понял
Только маленькое уточнение: а требуется обнулять то, что мы "воруем"?
0
|
|
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
||
| 15.07.2019, 11:19 | ||
|
0
|
||
|
79 / 60 / 19
Регистрация: 22.11.2015
Сообщений: 193
|
|||
| 15.07.2019, 11:47 | |||
|
Добавлено через 5 минут Офсет старый сишник, он объяснит, что любое попалзновение имеет эффект. Проц все равно полезит на контроллер, и это вызовет побочный эффект Добавлено через 2 минуты
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||
| 15.07.2019, 21:09 | |||
Факт остается фактом, что бы вы не говорили. Ваши знания, а значит и доход, будут сильно страдать, если вы будете опираться только на видео или статьи. Вы либо дойдете до этих знаний сами, но спустя гигантское время, либо таки научитесь воспринимать информацию из книг. Я вообще не завидую тем, кто берется работать на С++ с такими половинными знаниями, они просто мучиться будут: бороться с языком, вместо того, чтобы решать задачи.
0
|
|||
|
Неэпический
|
|||
| 15.07.2019, 23:07 | |||
|
Никакого стандартного поведения при перемещении по большому счету нет. Вся логика перемещения целиком и полностью возложена на разработчика класса. Вы, как разработчик класса вольны делать при перемещении что угодно. Однако, стоит всё же придерживаться нескольких "праведных" правил. Объект после перемещения, желательно, оставить в состоянии, пригодном для дальнейшего использования. Если такое условие обеспечить не удается, то нужно, как минимум, обеспечить возможность корректного уничтожения перемещенного объекта. Согласитесь, если код падает во время уничтожения перемещенного объекта - это Что касается классов стандартной библиотеки, то объекты после перемещения остаются в валидном, но неспецифицированном состоянии (valid but unspecified state).
0
|
|||
| 15.07.2019, 23:07 | |
|
Помогаю со студенческими работами здесь
11
Почему внутри sub не передается значение? Почему значение не передается в уравнение? В функцию передается пустое значение Почему не передается последнее значение из datagridview в массив? Скажите, пожалуйста, почему в переменной fn остаётся значение 1, а не символ, введенный с клавиатуры? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере 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
На первой гифке отладочные линии отключены, а на второй включены:. . .
|