- 13
- 67 198
Полевой Дмитрий
Russia
เข้าร่วมเมื่อ 21 ธ.ค. 2014
Привет! Меня зовут Дмитрий Полевой, мне 26 лет. Я 6 лет программирую на С++. Мне удалось поработать в различных IT-компаниях, а сейчас я ведущий разработчик в одной из крупных компаний в сфере строительства.
За время своей работы я столкнулся с проблемой - полное отсутствие качественных материалов по сложным и углубленным темам. Раз вы здесь, значит вас тоже это волнует.
Поэтому я решил создать свой канал, чтобы помочь разработчикам среднего и продвинутого уровня углубить свои знания и выйти за рамки стандартного понимания C++.
За время своей работы я столкнулся с проблемой - полное отсутствие качественных материалов по сложным и углубленным темам. Раз вы здесь, значит вас тоже это волнует.
Поэтому я решил создать свой канал, чтобы помочь разработчикам среднего и продвинутого уровня углубить свои знания и выйти за рамки стандартного понимания C++.
Все про std::forward | передача по значению - это ОК | Семантика перемещения
Boosty: boosty.to/polevoydmitry
TG: t.me/polevoydmitry
В этом видео мы наконец поговорим про функцию std::forward и идеальную передачу (perfect forwarding). Узнаем зачем нужна эта функция, какие проблемы она решает, реализуем функции std::move и std::forward, опишем проблему семантики перемещения и один из способов ее решения, где обнаружим, что передавать параметр по значению можно, и даже иногда нужно.
Так что - приятного просмотра!
00:00 - Начало
00:24 - Какую проблему решает std::forward
06:48 - Где используется std::forward
08:46 - Реализация std::move
14:50 - Реализация std::forward
22:23 - Проблема перегрузок для поддержки move-семантики
24:40 - Почему универсальная ссылка не всегда решит все проблемы
26:50 - Пять секунд релакса
26:57 - Передача по значению - иногда лучшее решение
29:31 - Заключение
TG: t.me/polevoydmitry
В этом видео мы наконец поговорим про функцию std::forward и идеальную передачу (perfect forwarding). Узнаем зачем нужна эта функция, какие проблемы она решает, реализуем функции std::move и std::forward, опишем проблему семантики перемещения и один из способов ее решения, где обнаружим, что передавать параметр по значению можно, и даже иногда нужно.
Так что - приятного просмотра!
00:00 - Начало
00:24 - Какую проблему решает std::forward
06:48 - Где используется std::forward
08:46 - Реализация std::move
14:50 - Реализация std::forward
22:23 - Проблема перегрузок для поддержки move-семантики
24:40 - Почему универсальная ссылка не всегда решит все проблемы
26:50 - Пять секунд релакса
26:57 - Передача по значению - иногда лучшее решение
29:31 - Заключение
มุมมอง: 1 225
วีดีโอ
Виды value, r-value ссылки, универсальные ссылки. Move-семантика с++
มุมมอง 1.9K21 วันที่ผ่านมา
Boosty: boosty.to/polevoydmitry TG: t.me/polevoydmitry Мы продолжаем разбирать тему семантики перемещения. И для дальнейшего изучения этой темы, нам важно разобраться с категориями value, и как их отличать, какие свойства есть у l-value ссылок и r-value ссылок, а также узнать про универсальные ссылки (forwarding references) и сворачивание ссылок. Все это мы разберем в этом видео. Так что - прия...
Основы семантики перемещения в с++
มุมมอง 7Kหลายเดือนก่อน
Boosty: boosty.to/polevoydmitry TG: t.me/polevoydmitry С этого видео мы начнем изучать большую и очень важную тему в языке с - семантику перемещения, понимание который поднимет вас на новый уровень в программировании. В этом видео мы узнаем причины появления семантики перемещения и разберем ее основы. Так что - приятного просмотра! 00:00 - Начало 00:28 - Когда и зачем добавили семантику перемещ...
Все про STD::SHARED_PTR за 20 минут | Углубленное программирование на C++
มุมมอง 2.4Kหลายเดือนก่อน
Boosty: boosty.to/polevoydmitry TG: t.me/polevoydmitry Ролик про std::unique_ptr: th-cam.com/video/E3PV_shkZeU/w-d-xo.html В этом видео мы поговорим про самый часто используемый умный указатель std::shared_ptr, разберем все его возможности, тонкости, плюсы и минусы, и как им правильно пользоваться. Приятного просмотра!
std::unique_ptr и идиома RAII | Углубленное программирование на C++: (По книге Скотта Мейерса) #9
มุมมอง 4.8K5 หลายเดือนก่อน
В этом видео мы детально рассмотрим главу 4.1 и частично главу 4.4 книги Скотта Мейерса "Effective Modern C ". С этого видео мы начинаем серию роликов про умные указатели (smart pointers) и начнем с идеологически самого первого и самого простого умного указателя std::unique_ptr. Мы рассмотрим что такое идиома RAII, как пользоваться std::unique_ptr и его основные возможности, которые нужно знать...
std::atomic и потокобезопасность | Углубленное программирование на C++: (По книге Скотта Мейерса) #8
มุมมอง 5K5 หลายเดือนก่อน
Больше видео: sponsr.ru/polevoycppguide В этом видео мы детально рассмотрим главу 3.10 книги Скотта Мейерса "Effective Modern C ", которая называется "Делайте константные функции-члены безопасными в смысле потоков". Мы разберемся что такое "гонка данных", как эта проблема решается, рассмотрим, что такое std::atomic, как им пользоваться, где им пользоваться не надо, и как делать функции безопасн...
typedef VS using В чем разница? | Углубленное программирование на C++: (По книге Скотта Мейерса) #7
มุมมอง 9K6 หลายเดือนก่อน
Больше видео: sponsr.ru/polevoycppguide В этом видео мы детально рассмотрим главу 3.3 книги Скотта Мейерса "Effective Modern C ", которая называется "Предпочитайте объявление псевдонимов применению typedef". Мы разберемся чем различаются ключевые слова typedef и using и где они используются.
Фигурная инициализация в С++ | Углубленное программирование на C++: (По книге Скотта Мейерса) #6
มุมมอง 18K6 หลายเดือนก่อน
Больше видео: sponsr.ru/polevoycppguide В этом видео мы детально рассмотрим главу 3.1 книги Скотта Мейерса "Effective Modern C ", которая называется "Различие между { } и () при создании объектов". Мы разберем что такое унифицированная (или же фигурная) инициализация, где она может использоваться и какие подводные камни содержит
AUTO и неопределенное поведение | Углубленное программирование на C++: (По книге Скотта Мейерса) #5
มุมมอง 4.5K6 หลายเดือนก่อน
Больше видео: sponsr.ru/polevoycppguide В этом видео мы детально рассмотрим главу 2.2 книги Скотта Мейерса "Effective Modern C ", которая называется "Если auto выводит нежелательный тип, используйте явно типизированный инициализатор". Мы разберем, как избежать ошибок при использовании auto и как правильно применять явно типизированные инициализаторы для получения ожидаемых результатов.
Всегда использовать AUTO? | Углубленное программирование на C++:(По книге Скотта Мейерса) #4
มุมมอง 3.5K6 หลายเดือนก่อน
Предыдущее видео: th-cam.com/video/MWKwqBLcxH0/w-d-xo.html В этом видео мы продолжаем углубленный разбор книги Скотта Мейерса "Современный и эффективный C ". Сегодня мы начнем изучение второй главы, посвященной объявлению auto, и разберем первую подглаву "Предпочитайте auto явному объявлению типа".
Как пользоваться DECLTYPE? | Углубленное программирование на C++:(По книге Скотта Мейерса) #3
มุมมอง 4.3K6 หลายเดือนก่อน
Предыдущее видео: th-cam.com/video/pQUX2w1j_iY/w-d-xo.html В этом видео мы разберем третью и четвертую подглавы книги Скотта Мейерса "Современный и эффективный C ", где познакомимся с интересным ключевым словом - DECLTYPE и DECLTYPE(AUTO). Рассмотрим как с ним работать, где он используется, какие подводные камни и сюрпризы он нам приготовил и как посмотреть выведенный им тип
Вывод типа auto | Углубленное программирование на C++ (По книге Скотта Мейерса) #2
มุมมอง 1.7K7 หลายเดือนก่อน
Предыдущее видео: th-cam.com/video/ZBlxquB9nEo/w-d-xo.html В этом видео мы начинаем углубленный разбор книги Скотта Мейерса "Современный и эффективный C ". Сегодня мы рассмотрим вторую подглаву, посвященную выводу типа auto.
Вывод типа шаблона | Углубленное программирование на C++ (По книге Скотта Мейерса)
มุมมอง 4.1K7 หลายเดือนก่อน
В этом видео мы начинаем углубленный разбор книги Скотта Мейерса "Современный и эффективный C ". Сегодня мы рассмотрим первую подглаву, посвященную выводу типа шаблона. Что вас ждет в этом видео: - Погружение в основные концепции вывода типа шаблона - Практические примеры кода для лучшего понимания материала - Советы и рекомендации от Скотта Мейерса
Лайк за креатор, а то эмаксвимовские консольные сектанты надоели.
9:17 Ха, наконец-то мой коммент хоть кому-то хоть на что-то пригодился! 🙂 "Посмотрите, как всё это выглядит. Это же просто отвратительно." Когда я в начале 200-х узнал, что началась какая-то движуха со стандартом, я был рад. Но в тот момент, когда я впервые увидел объявление лямбда-функции, меня стошнило, и ... до сего времени я использую C++98 (к счастью для моих задач его вполне достаточно). Спасибо, ребята, но --- нет. Я, конечно, человек тренированный даже на FORTH, но видеть код в стиле форта в С++ --- нет, мои ушатанные нервы такого не выдерживают.
И в очередной раз разработчики C++ блестяще решили проблему, которую сами же и создали.)))
Видео было очень полезным, спасибо!
Все это хорошо, но ничего не понятно, как это происходит на уровне ассемблера, на уровне регистров, стека
Здесь вообще все на поверхности. У тебя указатель на область памяти при std::move просто переносится а при копировании новый выделяется. Если говорить про стек тоже самое будет те же указатели и доп информация структур проплоцирлванных
Как компилятор захочет, так на ассемблере и будет реализовано
после этого видоса я задаюсь вопросом, а так ли я хочу изучать плюсы...
По факту здесь ничего сложного нет, просто есть небольшая путаница с lvalue и rvalue)) Даже если не углубляться в это в начале обучения, со временем все равно поймешь.
27:56 c rvalue будет 0 копирований и 1 перемещение, разве нет?
Если мы сразу передаем r-value, то, конечно же, будет просто одно перемещение, я тут имел ввиду, если мы будет передавать l-value через move: std::string str = "some long string"; .... add(std::move(str));
Сплошные костыли вместо вывода типов здорового человека.
🤝
Ответ на последнее - нужно было в первых редакциях Си11. Потом прикрыли.
передал по ссылке...
Астрологи объявили год годноты, количество крутого контента увеличолсь.
00:09 - *идельную передачу (Perfect forwarding)
Что запомнить? Не нужно выё... выделываться и поши по Сишному, без вот этой вот всей modern c++снуй ереси.
Mutex не туда воткнул.
Фигурные скобки это старая добрая агрегатная инициализация из С. Просто ее применение несколько расширили.
Хотел бы предложить тему для новых роликов: в чем разница между c-style, static и dynamic кастами в c++.
Классный контент! Огромное спасибо за видео. Очень жду продолжения) В будущем, если будет возможность, было бы интересно узнать и про constexpr от автора. По моему тоже немного запутанная тема)
хотелось бы примеров побольше на реальных кейсах, особенно с мув семантикой
Понятно объясняешь. Спасибо
Бро, твои видосы лучшие! подача топ, все понятно с первого раза
Подача действительно топ, душевная и очень полезная)
Классный видос! Все четко, по делу и очень понятно) Наконец то разобрался с универсальными ссылками😊
Дмитрий, а разбор самого загадочного типа умных указателей weak_ptr будет?
Плюсы круты. После 14 он стал комфортным
Большая просьба в следующем видео поподробнее рассказать для чего нужен в std::forward remove_reference. И за счёт чего там происходит подавление вывода типа. Большое спасибо за все видео.
Новый раздел алгебры - "Исчисление амперсандов". 🙂
Вот поэтому плюсы -- плохой язык. Нагорожена куча костылей только потому, что какие-то "гуру" утверждают, что указатели -- плохо. Внятных определений у костылей нет, извольте методом исключения ну или чувствовать. П.С. Периодически пишу на плюсах по мере надобности.
а какой тогда хороший язык?))
@@donlinoleum831 от задач зависит. Проблема плюсов в том, что изначально он ближе к чистому Си, но в него натащили всякой высокоуровневой фигни, чтобы сделать его типа современным. Си хороший язык, потому что занимает свою нишу и не пыжится стать одновременно ирлангом, хаскелем, питоном и чёрт знает ещё чем. Тот же питончик можно назвать хорошим языком, потому что его сложность скрыта для новичка и может никогда не понадобиться, если не возникнет задач. В плюсах же все кишки наружу, так, что приходится для простейших задач осваивать тонны документации. Чего только стоит вся эта бадяга со ссылками или с тем, когда какой конструктор вызывается. Тот же Паскаль с объектами, если игнорировать неудобный синтаксис, гораздо продуманее плюсов, ну да, без множественного наследования и без перегрузки операторов (вроде бы).
@@Ma_X64 Ну это очень спорный вопрос и вряд ли на него есть единственно верный ответ. То что питон хороший язык для новичка это понятно, но "хорошесть" языка все же определяется не тем каков он для новичка, а тем как и какие задачи он решает. Си хороший язык, но остался в своей нише. А вот C++ пошел дальше и решает уже много каких задач. Что C++, что Rust точно юзерфрендли не назовешь, а вот заменить их во многих сферах нельзя. Да и не нужно. На мой взгляд это говорит о том, что программирование является все-таки не очень простым занятием. И нужно ли делать его простым, делая менее глубоким и производительным, ну хз. Хз. Мне кажется, что все-таки не надо).
@@donlinoleum831 Можно поподробнее о "много каких задач"? Потому что в системном программировании плюсы не взлетели, в энтерпрайзе их вытеснили джава и шарп, в некритичных к скорости задачах тот же питон.
@@eugenenuribekov1231 программы для обработки изображений, программы для работы с 3D графикой, рендеринг, практически весь графонистый (и не только) геймдев, браузеры. Музыкальные программы, vst плагины для них. Ну это то, что пришло на ум из такого, бытового уровня)
Помоему в delete так же как и free уже есть встроенная проверка на null
Капюшон снимай а то жбан закипит и пар с ушей пойдет😅
думаю, автор сам разберется как ему лучше))
Классная компиляция сразу нескольких умных книжек, просто сжатая систематизированная квинтессенция знаний. Лайк, подписка, жду следующего видео. Большое спасибо.
Может пора уже на rutube заливать?
не надо тут такие страшные вещи писать.
я картавый и на протяжении всего видео боролся с мозгом, который воспринимал rvalue, lvalue, rref, lref как набор rlrlrlrlrrl
легендарен, очень хорошо рассказал
давай следующее про std::forward
Был убеждён что не придётся читать книги по плюсам.. Не владея этими темами приходится передавать по значению сжигая память.
😵💫
Что ж, раньше я думал, что знаю с++. Теперь я понимаю, что знаю си....
я тоже 2 года назад понял что не знаю самую "интересную" часть с++
Снова о костылях для языка инвалида ну или про удаление гланд не через горло :)
Здравствуй. Вы видимо предлагаете другой язык с поддержкой ООП раз пишите такое. Ну предлагайте, давайте посмотрим на этот язык. Главное что бы и с памятью можно было работать и ту же мув семантику поддерживает, и возможность запускать на любом оборудовании без виртуалки.
@@grigoriyleps2001 А вам недостаточно существующих? Возьмите Java или Python. Там хотя бы такие костыли не нужны. Понимаете, сложность программы не определяется языком программирования или количеством строк, а также RAII, exceptions... Это только безграмотные считают, что язык программирования имеет значение :)
Вангую, следующее будет про перфект форвардинг.
как раз речь зашла о методе вектора emplace_back
Здравствуйте, конечно простите меня за глупый вопрос, но когда я пытался всё руками вбить, по теме с прошлого урока, что бы на практике закрепить знания, у меня визуал студия поругалась вот на эту запись SomeClass(const BigData& obj) { data = new BigData(*obj.data); } мол класс BigData не содержит переменной data. Не могли бы подсказать, как устранить данную проблему? Я тока учу плюсы..
Добрый день, в прошлом видео был пример с конструктором копирования класса SomeClass, он выглядел следующем образом: SomeClass(const SomeClass& obj) { data = new BigData(*obj.data); } Вы в качестве параметра передаете объект типа BigData вместо SomeClass, поэтому у вас появляется эта ошибка.
@@PolevoysProgramming ааа, точно, вот не внимательный балбес, спасибо, всё заработало!
Skill issues
Друг, огромное спасибо за видео!
Я в шоке что у программистов на С++ такие же вопросы как и у нас бедных плебеев с других языков
Вот такого блогера нам не хватало.
Спасибо за видео, после него я понял почему rust такой популярный :)
Какая же гадость этот ваш цпп
Обожаю плюсы! Всегда найдётся способ выстрелить себе в ногу. =) Хотелось бы, чтобы автор также упомянул о том, что компилятор может предоставлять конструктор и оператор перемещения по умолчанию при определённых условиях. Надеюсь, в будущих видео будут раскрыты юз-кейсы использования семантики перемещения и различные её нюансы. Например, особенности при использовании с виртуальными классами, когда мы перемещаем объект производного класса через объект базового класса. Если не секрет, какая IDE используется в видео? Спасибо за видео, однозначно лайк!
QtCreator
@PolevoysProgramming Друг, спасибо за контент! Пожалуйста, пофикси задержку видео относительно аудио. Это можно сделать без реэнкода за секунду с ffmpeg, подвинув видео вперед на ~200мс (хотя бы в будущих видео): ffmpeg -i "./this-video.mp4" -itsoffset 0.2 -i "./this-video.mp4" -map 0:v -map 1:a -c:v copy -c:a copy "./this-video.fixed.mp4"
На самом деле, можно, частино, решить проблему перемещения, обходясь исключительно l-value ссылками, не "убивая" семантику копирования. Как верно заметили, семантика перемещения включает в себя как минимум перегрузку конструктора и оператора присваивания. Т.е. мы можем создать любой другой конструктор, так, чтобы он отличался от конструктора копирования. Например, можно ввести новый класс, который в себе хранит ссылку на источник перемещения, и, примем как соглашение, что данный адаптер нужно использовать, когда необходимо переместить объект: template<typename T> struct Movable { T& movable; }; Тогда можно сделать следующий конструктор class Example { public: Example(Example const&); // copy ctor Example(Movable<Example>&); // move-like ctor }; Далее уже можно развить эту тему для более удобного использования, но, как я уже говорил, это может лишь частично решить проблему, так как будет не доступна возможность создавать временный обект, который передается сразу как аргумент. Т.е. без полноценной поддержки новых типов ссылок нельзя было бы корректно написать что-то вроде: Example e(std::move(Example())); Причина в том, что время жизни такого временного объекта можно продлить только через l-value ссылку на константу, а перемещение требует чтобы ссылка была как раз таки не константная. Возможно кому-то может показаться что в таком случае можно применить снятие константности через const_cast, но это уже прямо таки конкретный костыль, который может привести к UB, и, лично я думаю, что именно эта причина была одна из основных в мотивации добавить именно новый вид ссылок для поддержки семантики перемещения.
Я воще не вижу проблемы в том что выделять дважды память я вижу проблему в неразумно больших классах.
Если у вас такие большие объекты это либо одноразовая акция для инициализации или у вас что-то не так