Тёмный

C++11 | Что такое rvalue ref, type&& | Что делает std::move, auto? 

Daria Emacs
Подписаться 15 тыс.
Просмотров 15 тыс.
50% 1

Опубликовано:

 

3 окт 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 114   
@Freedom_Code
@Freedom_Code 5 лет назад
Спасибо огромное за понятное и очаровательное объяснение ! Вы большая умничка !
@DariaEmacs
@DariaEmacs 5 лет назад
Спасибо, Андрей, за такой приятный комментарий! :))
@JustPlayingBroGD
@JustPlayingBroGD 6 лет назад
Хоть я и на шарпе пишу, все равно Ваши видосы поглядываю ))
@MrSobarik
@MrSobarik 3 года назад
супер, наконец-то человеческим языком объяснили!
@DariaEmacs
@DariaEmacs 3 года назад
Спасибо)!
@DmitriNesterov
@DmitriNesterov 11 месяцев назад
На двенадцатой минуте понял идею. Спасибо ❤ Первые 12 минут не переживал, что так и не пойму, просто, ловил позитив 😊
@world_entropy
@world_entropy 5 лет назад
Видео аллюзии на контент гениальные! Вы - молодец и талант!
@DariaEmacs
@DariaEmacs 5 лет назад
Спасибо 😊!
@alexcellencevolodindro
@alexcellencevolodindro 3 года назад
Ни разу не видел такой потрясающей подачи сложной информации!!!
@DariaEmacs
@DariaEmacs 3 года назад
Спасибо большое! :)
@sarlevdiz
@sarlevdiz 6 лет назад
Ооочень хорошо!
@IExSet
@IExSet 3 года назад
&& это ж универсальная ссылка, она может быть как rvalue ссылкой, так и lvalue (в аргументах функции), поэтому нужен move
@Nop_90h
@Nop_90h 11 дней назад
вот как раз в этом случае нужен forward, а не move, иначе ты lvalue помувишь.
@13eev
@13eev 6 лет назад
Так, ждем курса по С++ от нуля до сеньера.
@DariaEmacs
@DariaEmacs 6 лет назад
😂😀
@13eev
@13eev 6 лет назад
Не ну а че, полный курс по С++ - это тема которая зайдет, тем более в твоей подаче. От структурного до ООП, плюс сдл. По пути, конечно, можно рассказывать о твоих насройках/шоткатах/плагинах вима )
@АлеАле-ч2й
@АлеАле-ч2й 6 лет назад
дядь , тут симпл код записал уже, вот совсем недавно его видео появились.. а ваще ж ютуб это не книжки читать( не нужно забывать)
@АлександрБугримов-о1е
Да, было бы отлично посмотреть такой курс в Дашином исполнении.
@АлеАле-ч2й
@АлеАле-ч2й 6 лет назад
вау! вот это подгон! поклон!
@TheWladberlin
@TheWladberlin 4 года назад
У-ти, какая, сразу смотреть хочется, а мозг отключается :))
@NoNo-fl6oq
@NoNo-fl6oq 2 года назад
вау, классное объяснение!
@errorgrisha
@errorgrisha 6 лет назад
Спасибо, очень круто и все понятно.
@HeBepo9lTHblu
@HeBepo9lTHblu 6 лет назад
Ничего не понял, так как не программист, но вы хорошо выглядите! ;) И умница и красавица...эх, не девушка, а мечта! :)
@DariaEmacs
@DariaEmacs 6 лет назад
Спасибо😊).
@absent3444
@absent3444 6 лет назад
На stepic'е в курсе (продолжение) по c++ достаточно хорошо рассказывается про 11ый стандарт (и чуть чуть 14-ый)
@NoNo-fl6oq
@NoNo-fl6oq 2 года назад
а на степике бесплатно?
@absent3444
@absent3444 2 года назад
@@NoNo-fl6oq да
@ayvengotwc1575
@ayvengotwc1575 6 лет назад
Daria вы крутая!
@anton.k.
@anton.k. 6 лет назад
Лайк, кто соскучился))
@Hierrussalimsky
@Hierrussalimsky 6 лет назад
я скучалъ !!1
@sergeymurtazin1416
@sergeymurtazin1416 4 года назад
Я понял Я понял!!! !!!Я ПОНЯЛ!!! Я наконец-то понял, что это такое Большое спасибо
@DariaEmacs
@DariaEmacs 4 года назад
Ура!!! )))))))))
@kirillchurkin9318
@kirillchurkin9318 4 года назад
На самом деле, если в функцию уже пришёл Type&& не обязательно делать ещё раз std::move, однако если вы используете шаблоны, то, да, Type&& может уже являться универсальной ссылкой
@artemsilivanchik
@artemsilivanchik 5 лет назад
Хороший канал! Приятная девушка!
@nepBoHax
@nepBoHax 6 лет назад
Лайк за лыжи) Ну и не только)
@Kalin_cheetah
@Kalin_cheetah 3 месяца назад
Классный ролик, спасибо вам! Один момент до меня все-таки не доходит: на уровне памяти чем копирование отличается от перемещения? Вот есть вектор объектов типа Т. Мы вызывает метод push_back() и передаем в качестве аргумента rvalue при помощи std::move(), но чтобы новый элемент вектора встал последовательно за предыдущим, его же нужно туда поместить, т.е процессор все равно проделывает работу по размещению в памяти данных. Я думал, что это и есть основное процессорное время на данную операцию. Или же проблема заключается в том, что объект сначала создается на стеке, а потом его нужно еще и скопировать в нужное место? Т.е, перемещая, мы все равно тратим процессорное время на размещения объекта в новых ячейках памяти, но избегаем создания временного объекта на стеке?
@viktor_borodin
@viktor_borodin 3 года назад
разыменование указателя тоже даёт lvalue. Причём указатель - это одна переменная, а результат разыменования это уже другая сущность, которая не имеет имени, но тем не менее lvalue. В этом можно убедиться, посмотрев в cppreference. Опять же функция может возвращать и ссылку и указатель. Таким образом происходит в случае со ссылкой возврат lvalue. Возвращаемый указатель, если я правильно понимаю, это всё-таки rvalue. Спасибо за пояснения.
@Hierrussalimsky
@Hierrussalimsky 6 лет назад
Хоть я и не пишу на Ц вовсе - всё равно Ваши видосы с удовольствием смотрю!!1
@tsmokuday
@tsmokuday 6 лет назад
Эхх скучали)
@apelsin3001
@apelsin3001 3 года назад
Тяжко мне эта тема заходит. Надо еще несколько раз посмотреть ваше видео.
@zzz7net
@zzz7net 6 лет назад
"R-value" ссылки, наряду с шаблонами - самая сложная концепция языка С++. Поэтому этот ролик самый крутой и полезный. Жаль, что такое интересно только "задротам" и "гикам". Только представьте, насколько упали бы просмотры ИванГая, если бы он начал пилить видео по С++
@DariaEmacs
@DariaEmacs 6 лет назад
Спасибо! ))) ❤️ Зато все игры, в которые играют "ИванГаи", написали "гики"). Так что без нас никуда).
@kirillchurkin9318
@kirillchurkin9318 4 года назад
Проблема в том, что в с++ 6 видов ссылок
@IExSet
@IExSet 3 года назад
А всякие там SFINAE и прочее метапрограммирование (списки типов) - это так, семечки :-)
@hmmmmmalex
@hmmmmmalex 6 лет назад
Добрый день. Может уже спрашивал. Сделайте видео-cравнение контейнеры std vs контейнеры QT
@Ланс-м1в
@Ланс-м1в 5 лет назад
Спасибо. По этой теме мало доступной информации нашел. К сожалению, в основном статьи на английском. Новичку приходится общую картину рисовать по крупицам. Так понимаю, в функции перемещения требуется снова приводить к rvalue, поскольку параметр функции сам является lvalue с типом правосторонняя ссылка? Т.е. параметр опять дает имя безимянному объекту.
@cyrilanisimov
@cyrilanisimov 4 года назад
Остроумная девица)
@МихаилГригорян-ж9п
Спасибо. Видео хорошее - в сжатом виде и доступной форме об основах move-семантики. А разрешите маленькую ложечку дегтя?) Думается, что было бы еще нагляднее, если бы в вашем классе Dog data был бы указательным типом. Тогда полезность механизма перемещения стала бы очевиднее. Да и вопрос с обнулением data rvalue-параметра стал бы совсем не праздным.
@fillon_smith
@fillon_smith 6 лет назад
Вот так, при помощи нехитрого move и амперсандов мы можем сделать из lvalue rvalue. Но зачем? Спасибо за видео, вставка "Есть ли у тебя программа?" шикарная :)
@DariaEmacs
@DariaEmacs 6 лет назад
Спасибо). >"Но зачем?" Две клетки в зоопарке: со слоном и львом. А таблички перепутаны. Вопрос: Что легче, поменять животных местами или поменять таблички?)) Вот rvalue нужно, чтобы поменять местами таблички. Может быть, не совсем корректное сравнение, но всё же).
@fillon_smith
@fillon_smith 6 лет назад
А кто перепутал таблички? rvalue -это все-таки одна из табличек, или инструмент для их замены?
@DariaEmacs
@DariaEmacs 6 лет назад
Инструмент.
@АлеАле-ч2й
@АлеАле-ч2й 6 лет назад
ого новая вставка с лыжами?
@DariaEmacs
@DariaEmacs 6 лет назад
Ага). 👍 Алексей - самый внимательный).
@kirillchernyakov6825
@kirillchernyakov6825 4 года назад
Спасибо большое, но Ваши постоянные странные смешки - это как-то криповато =) Но видео годное, оратор в теме понимает =)
@it-coding
@it-coding 2 года назад
И еще не понятно, зачем нам тогда в функции параметр делать r-v , и передавать с move, если внутри функции он будет l-v и нам там нужно с ним работать как с обычной ссылкой на значение , можно принимать тогда в функции значение по ссылке и в вектор уже перемещать , будет тот же результат но меньше текста , как мне кажется )?
@sleepyNovember_project
@sleepyNovember_project 7 месяцев назад
Так и есть, просто это пример для лучшего понимания работы этого всего
@it-coding
@it-coding 2 года назад
В первом примерно мы передаём по ссылке в функцию и в вектор пушим копию, но если мы в вектор будем тоже передавать через move, разве это не будет одно и тоже ? Что мы преобразуем ссылку в рвелью и переместим в вектор ?
@philippmaluta978
@philippmaluta978 6 лет назад
Неделю назад купил эту книжку!
@ЭдуардОрехов-г7я
Меня очень интересует вопрос. Недавно я посмотрел урок по c#, где программа дописывала сама себя без перезагрузки процесса или запуска нового процесса. Возможно ли сделать так же на c++?
@turel1405
@turel1405 6 лет назад
а вообще какой общий курс можно задать при изучении языка СИ?посоветуйте,что нужно параллельно изучать вместе с языком?как это делали в вузах?
@DariaEmacs
@DariaEmacs 6 лет назад
Мы изучали ядро ОС, дописывали его, изменяли, потом изучали параллельное программирование на Си. Главное, это то, что Вы хотите от этого изучения, что делать потом и что уметь.
@АлександрСоколов-е4ц
Интересен Ваш опыт и принцип применения квалификаторов типа volatile и restrict?
@DariaEmacs
@DariaEmacs 6 лет назад
В рабочих проектах volatile редко, но встречала, а restrict ни разу :). Исходя из этого, в теории часто спрашивают о них, а на практике не пришлось использовать.
@АлександрСоколов-е4ц
Если я правильно понял, то вы хотите сказать, что при полном понимании и умении применения данных элементов оптимизации, просто не предоставилось корректного случая, точнее возможности корректного использования. Так? Или ответ содержал посыл, что если спросить программиста - он вспомнит что это за "зверь", но в повседневной жизни возможности применения на столько редко попадаются, что о них просто забывают? Это зависит от культуры программирования или от уровня программиста или только от необходимости применения?
@DariaEmacs
@DariaEmacs 6 лет назад
Проекты разные, где-то необходимо знать до мелочей одни возможности языка, где-то другие. В зависимости от того, насколько часто Вы применяете что-то, Вы и знаете это "что-то" хорошо или хуже. Я хотела сказать, что это не те квалификаторы, которые мне удалось применить в своей работе). Так что да, от необходимости и частоты применения.
@ruslan.valiakhmetov
@ruslan.valiakhmetov 6 лет назад
Спасибо за видос! Если std::move используется внутри функции, зачем делать std::move в ее параметрах, если можно просто передать по обычной ссылке? Мне кажется для того что бы видеть, что эта функция забирает владение, или как?
@lucslenovak8356
@lucslenovak8356 4 года назад
По ссылке push_back в вектор сконструирует копию добавляемого обьекта. Для того, чтобы избежать расходов на копирование исходный объект приводится к типу &&.
@IExSet
@IExSet 3 года назад
&& Это универсальная ссылка, вы не сможете передать rvalue по обычной ссылке (если не объявите ссылку константой).
@lotos-mudr
@lotos-mudr 4 года назад
о, ещё и лыжи)
@valentinlishkov9540
@valentinlishkov9540 6 лет назад
Понял що: lavalue - контайнер , rvalue - то що ставим внутри контайнера
@phantomium3159
@phantomium3159 6 лет назад
Молодец, отлично объясняешь. Единственное, странно объяснять что такое шаблон в контексте данного урока, в эту тему нечего лезть если не знаешь темплейтов) И конечно, как вступление в тему категории значений в с++ неплохо. Но про универсальные ссылки ты упомянула совсем вскользь, про них сделай пожалуйста отдельно видео. Я считаю, заговорив про универсальные ссылки необходимо объяснять про reference folding и про std::forward. И еще можно раскрыть по подробнее исходный код move и forward - там очень интересно)) Если хватит сил можно докопаться до xvalue, pure value, glvalue это тоже интересно по мне) Вообще подача уникальная в рутубе, так держать ты большая молодец, продолжай в том же духе, умничка, респект. С++ как математика, его изучать можно бесконечно))
@DariaEmacs
@DariaEmacs 6 лет назад
Спасибо). URef, конечно, заслуживают отдельного видео, там как раз и про *reference collapsing* и про std::forward уместно рассказывать. Всё остальное, что Вы перечислили, вряд ли будет интересно широкой публике, хотя, согласна, вещи увлекательные)).
@Acid31337
@Acid31337 6 лет назад
Жесть, похоже комитет по стандартизации решил специально такой язык сделать, чтоб удобно было на собеседовании каверзные вопросы задавать. О людях кто подумал? (
@northkoreaua
@northkoreaua 6 лет назад
та не так там все страшно на самом деле. просто надо руку набивать
@sergiusnn
@sergiusnn 6 лет назад
Где то за вами я видел книжечку по CUDA =)
@DariaEmacs
@DariaEmacs 6 лет назад
Да, есть такая).
@sergiusnn
@sergiusnn 6 лет назад
Был бы рад увидеть на вашем канале видео о параллельных вычислениях, CUDA, и если капнуть поглубже, OpenCL.
@northkoreaua
@northkoreaua 6 лет назад
незнаю-незнаю, Меерс очень доступно разжевал
@DariaEmacs
@DariaEmacs 6 лет назад
да, но не в книге).
@magcoder8814
@magcoder8814 6 лет назад
В 23 стандарте хотят убрать указатели(Источник: Хабрахабр). На кой чёрт их убирать? Язык, скорее всего, будет ещё сложнее для новичков.
@DariaEmacs
@DariaEmacs 6 лет назад
Сейчас в Джексонвилле обсуждали только C++20, С++23 еще нет. Про запрет указателей - это была первоаперльская шутка четырех иностранных блогеров, и все это перепостили.
@DariaEmacs
@DariaEmacs 6 лет назад
Вот один из них: arne-mertz.de/2018/04/raw-pointers-are-gone/ Update 2018-04-02: This post was, of course, an April fool’s joke. Together with four other bloggers we decided to orchestrate a bunch of blog posts about this topic. // Update 2 апреля: Это, конечно, была 1апрельская шутка.
@magcoder8814
@magcoder8814 6 лет назад
Когда я выучу английский, я им тоже как-нибудь пошучу
@DariaEmacs
@DariaEmacs 6 лет назад
Вот список того, что обсуждали и что будет изменяться в С++20, нет ничего про указатели, по крайней мере, я не нашла:) botondballo.wordpress.com/2018/03/28/trip-report-c-standards-meeting-in-jacksonville-march-2018/#cxx20
@DariaEmacs
@DariaEmacs 6 лет назад
😂
@anatolyvatson2542
@anatolyvatson2542 Год назад
Как женщина может в таком разобраться? Я не верю
@sleepyNovember_project
@sleepyNovember_project 7 месяцев назад
Почему
@in9597
@in9597 6 лет назад
про советские фильмы twitter.com/maxim_nm/status/1040210903151587328
@maxan4037
@maxan4037 6 лет назад
А чем мув лучше простого приведения (Dog&&)?
@dat_21
@dat_21 6 лет назад
В данном случае - ничем. А для шаблонного параметра будет применяться сжатие ссылок (reference collapsing), ваше приведение не будет работать.
@maxan4037
@maxan4037 6 лет назад
Все равно не понимаю, почему, к примеру, такой код templatet&&cast(type&z){return (type&&)z;} не может заменить move.
@DariaEmacs
@DariaEmacs 6 лет назад
Можно вместо std::move использовать static_cast, но есть два важных отличия двух подходов (кроме мелких нюансов): 1. std::move четко показывает, _ЧТО_ Вы хотите сделать (а это важно для тех, кто будет читать Ваш код. Код ведь чаще читается, чем пишется.) 2. Программисты часто ошибаются и вместо && пишут & в static_cast, а с std::move такой досадной ошибки не произойдет. Дополнительным плюсом будет возможность погрепать по коду, где у Вас происходит move, вместо cast.
@DariaEmacs
@DariaEmacs 6 лет назад
Спасибо😊! Хотела рассказать про сжатие ссылок, но посчитала, что это будет слишком тяжело в одном видео)), оставила на следующий раз.
@MsKhch
@MsKhch 6 лет назад
Нихрена не понял...
@bobhutchinson3638
@bobhutchinson3638 5 лет назад
NSFW
@Kitsikoo
@Kitsikoo 6 лет назад
Совсем канал забросила)
@DariaEmacs
@DariaEmacs 6 лет назад
Виноват, исправлюсь)).
@Kitsikoo
@Kitsikoo 6 лет назад
Оч хотелось бы, чтобы ты подняла вопрос (Java) восходящих и нисходящих преобразований типов классов. Все эти апкасты и даункасты выносят моск. Не понимаю - нафига??? :)
@DariaEmacs
@DariaEmacs 6 лет назад
Хорошо, обсудим).
@Kitsikoo
@Kitsikoo 6 лет назад
Круто, ждём-с ^__^
@Poker-s_S.V.
@Poker-s_S.V. 4 года назад
Сылка & -это символьный псевдоним цифрового адреса(так как в компе все память). Указатель * - это ТИПИЗИРОВАННАЯ переменная(с отсчетом ячеек по размеру типа), хранящая адрес типизированной ячейки. Обменять не выделяя память, можно только обменяв адреса на память - это ФАКТ! По логике вещей, отправить псевдоним на псевдоним, означает отправить один и тот же адрес - но это если бы процессор понимал что такое ссылки, а он то знает только адреса. Следовательно, компилятор при линковке, псевдоним на псевдоним, мог бы подсунуть только один и тот же адрес. Таким образом двойная ссылка полный бред. В принципе, отличия ссылки от указателя в том, что ссылка всегда имеет один и тот же адрес, а указатель может иметь любой адрес, но все они типизированные псевдонимы, с отсчетом ячейки по размеру типа, и понимаются только компилятором.
@DariaEmacs
@DariaEmacs 4 года назад
Долго же Вы спали, товарищ)). Двойная ссылка уже 9 лет, как не бред). en.cppreference.com/w/cpp/language/move_constructor en.cppreference.com/w/cpp/utility/move
@Poker-s_S.V.
@Poker-s_S.V. 4 года назад
@@DariaEmacs двойной ссылки нет и не будет, товарищ...))) потому, что это не логично. Есть просто закрепление ячейки памяти при возврате результата, без явного указания псевдонима. А, вы можете называть это ка хотите, это не есть истинное понимания, а просто ограниченная абстракция нагружающая мозг ...))) нужно немножко понимать, что происходит на низком уровне, тогда все будет понятно. Я, же написал, в принципе, отличия ссылки от указателя в том, что ссылка всегда имеет один и тот же адрес, а указатель может иметь любой адрес, но все они типизированные псевдонимы, с отсчетом ячейки по размеру типа, и понимаются только компилятором. Функция это временный объект, и то что она возвращает находится во временной памяти, следовательно, возвращаемый адрес ячейки ПЕРЕМЕННОЙ созданной в функции, освободится после возврата результата, а значит после возврата результата в этой области памяти может быть все что угодно. Это и логично! А, ново введение позволяет неявно фиксировать эту память, вот и все. Пример: int* fooncP(int a, int b) { return new int(a + b); //чтоб вернуть указатель на результат, нужно ячейку зафиксировать //оператором выделения памяти NEW, иначе, так как функция временный объект то и возвращаемое //значение функцией находится во временной памяти, которая освободится после использования //функции, и тем самым по адресу в ячейке может оказаться все что угодно. }
@DariaEmacs
@DariaEmacs 4 года назад
Ах, Боже мой! Так Вы за слово зацепились))? Рада, что у Вас столько времени есть на мой блог)), спасибо за просмотр и раскрутку)).
@Poker-s_S.V.
@Poker-s_S.V. 4 года назад
@@DariaEmacs ...))) о так вы просто рисуетесь, значит программирование не ваш конек. Бросьте это дело, оно не для вас.
@DariaEmacs
@DariaEmacs 4 года назад
Рисуетесь Вы, а 🤣 у меня стаж коммерческого программирования 15 лет)).
Далее
Women’s Free Kicks + Men’s 😳🚀
00:20
Просмотров 1,2 млн
🦊🔥
00:16
Просмотров 634 тыс.
Собеседование | Junior C++
57:15
Просмотров 247 тыс.
std::move and the Move Assignment Operator in C++
16:06
Move Semantics in C++
13:10
Просмотров 294 тыс.
lvalues and rvalues in C++
14:13
Просмотров 316 тыс.
Women’s Free Kicks + Men’s 😳🚀
00:20
Просмотров 1,2 млн