|
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
|
||||||
Как передается значение в функцию и почему после перемещения знач. остается?14.07.2019, 23:05. Показов 1812. Ответов 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 |
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||||||||
| 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
|
|||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||
| 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, а не символ, введенный с клавиатуры? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|