Всем привет. Завел приватный канал в мессенджере Max. Буду его использовать как дубль дискорда для выкладки ссылок на лекционные стримы.
Можно присоединяться: https://max.ru/join/tUgCa6XnmjppjHzWO1ufz59pOE7wlIkYpqHnxtuPrHs
Те, кто пишет, что наличие моего канала в Max -- это поддержка усилий властей РФ по блокированию Telegram, на мой взгляд, открывают простор для обвинений такого рода по любым поводам. Такую логику при желании можно распространить на что угодно. Например, сказать, что наличие у меня канала на YouTube -- это поддержка усилий этой платформы по блокированию русскоязычных военблогеров. Или что наличие у меня канала в Discord -- это поддержка политики руководства Discord по продвижению diversity.
Наличие нейтрального образовательного канала на любой платформе не является автоматически согласием со всеми решениями администрации этой платформы и аффилированных с ней инстанций. Людей, которые приходят с подобными предъявами (с какой бы стороны политического спектра они ни находились), просто не стоит слушать. И уж конечно, в своих решениях о развитии своих соцсетей я не собираюсь учитывать мнение крикливых меньшинств.
Как только у меня будет возможность завести публичный канал в Max с комментариями и прочим, я, разумеется, сделаю это.
#official
Можно присоединяться: https://max.ru/join/tUgCa6XnmjppjHzWO1ufz59pOE7wlIkYpqHnxtuPrHs
Те, кто пишет, что наличие моего канала в Max -- это поддержка усилий властей РФ по блокированию Telegram, на мой взгляд, открывают простор для обвинений такого рода по любым поводам. Такую логику при желании можно распространить на что угодно. Например, сказать, что наличие у меня канала на YouTube -- это поддержка усилий этой платформы по блокированию русскоязычных военблогеров. Или что наличие у меня канала в Discord -- это поддержка политики руководства Discord по продвижению diversity.
Наличие нейтрального образовательного канала на любой платформе не является автоматически согласием со всеми решениями администрации этой платформы и аффилированных с ней инстанций. Людей, которые приходят с подобными предъявами (с какой бы стороны политического спектра они ни находились), просто не стоит слушать. И уж конечно, в своих решениях о развитии своих соцсетей я не собираюсь учитывать мнение крикливых меньшинств.
Как только у меня будет возможность завести публичный канал в Max с комментариями и прочим, я, разумеется, сделаю это.
#official
👎281👍265💩79🤡76❤36🫡25🥴11🤔8🗿8😁7😭5
Я забыл написать на прошлой неделе, что всё-таки успел подать заявку на C++Russia этого года с увлекательным докладом о семантических процессах, уже третьим в серии. На этот раз будем говорить про вывод типов (в сочетании с перегрузкой).
В связи с этим могу предложить аудитории небольшую проблемку. Да я знаю что не пятница, но в пятницу я буду в самолёте в Йошкар-Олу, где я буду в субботу читать лекцию по современным методам рекламации памяти в iSpring.
Так что давайте скажем, что среда это маленькая пятница.
https://godbolt.org/z/qEehP4aMv
Clang отказывается компилировать declaration.
GCC компилирует, но проваливает static_assert.
На чьей вы стороне?
UPD: ожидаются ссылки на стандарт.
#questions
В связи с этим могу предложить аудитории небольшую проблемку. Да я знаю что не пятница, но в пятницу я буду в самолёте в Йошкар-Олу, где я буду в субботу читать лекцию по современным методам рекламации памяти в iSpring.
Так что давайте скажем, что среда это маленькая пятница.
template <auto f = []{}>
struct S {};
S x, y;
static_assert(std::is_same_v<decltype(x), decltype(y)>);https://godbolt.org/z/qEehP4aMv
Clang отказывается компилировать declaration.
GCC компилирует, но проваливает static_assert.
На чьей вы стороне?
UPD: ожидаются ссылки на стандарт.
#questions
❤42👍17😁11🔥5❤🔥1🤮1🙏1
Несколько объявлений.
(1)
Поскольку на прошлом стриме был запрос на обзор последнего CppCon, начну потихоньку публиковать на boosty по три доклада.
Первый пост (всего будет 5-6).
https://boosty.to/cpp_lects_rus/posts/23221965-bb69-423e-85e8-f01156805405?share=post_link
Внутри скриншоты, таймлайны и какие-то мои мысли насчёт того почему доклад удачный или почему нет.
Первая тройка -- абсолютный, но при этом и очевидный must see в моём понимании. Своего рода консервативная инвестиция вашего времени. Следующая тройка будет более внезапной.
Доступ решил выставить джуновый т.к. студенты должны смотреть скорее лекции чем доклады ))
(2)
Очередной стрим для подписчиков проведу 1-го марта в 21 час по Москве. Прошлый стрим можно посмотреть тут: https://t.me/cpp_lects_rus/338
Первые минут двадцать поболтаю про то как движется прогресс по книге по C++ (главы 4, 5 и 6) и про внезапный соевый протест, который тут недавно случился у меня на канале. Также расскажу про свои планы на конференции этого года: C++Russia, PHDays, Zero Cost. Дальше буду отвечать на вопросы.
Ссылку на стрим заброшу в чат в воскресенье днём. Стрим будет по студенческому доступу. Вопросы можно накидывать уже сейчас: https://www.donationalerts.com/r/cpp_lects_rus
(3)
Выкладку лекций магистерского курса на английском начну в эту субботу 28 февраля. Первая появится онлайн в 7 вечера по Москве.
#official #boosty
(1)
Поскольку на прошлом стриме был запрос на обзор последнего CppCon, начну потихоньку публиковать на boosty по три доклада.
Первый пост (всего будет 5-6).
https://boosty.to/cpp_lects_rus/posts/23221965-bb69-423e-85e8-f01156805405?share=post_link
Внутри скриншоты, таймлайны и какие-то мои мысли насчёт того почему доклад удачный или почему нет.
Первая тройка -- абсолютный, но при этом и очевидный must see в моём понимании. Своего рода консервативная инвестиция вашего времени. Следующая тройка будет более внезапной.
Доступ решил выставить джуновый т.к. студенты должны смотреть скорее лекции чем доклады ))
(2)
Очередной стрим для подписчиков проведу 1-го марта в 21 час по Москве. Прошлый стрим можно посмотреть тут: https://t.me/cpp_lects_rus/338
Первые минут двадцать поболтаю про то как движется прогресс по книге по C++ (главы 4, 5 и 6) и про внезапный соевый протест, который тут недавно случился у меня на канале. Также расскажу про свои планы на конференции этого года: C++Russia, PHDays, Zero Cost. Дальше буду отвечать на вопросы.
Ссылку на стрим заброшу в чат в воскресенье днём. Стрим будет по студенческому доступу. Вопросы можно накидывать уже сейчас: https://www.donationalerts.com/r/cpp_lects_rus
(3)
Выкладку лекций магистерского курса на английском начну в эту субботу 28 февраля. Первая появится онлайн в 7 вечера по Москве.
#official #boosty
🔥44❤24👍14👎3❤🔥2💩2😁1🤮1🙏1
Всем привет. Сегодняшний пятничный чилаут будет посвящён выводу типов для множеств перегрузок (да, продолжаю готовиться к C++ Russia).
В принципе с этим нет проблем, особенно если мы подсказываем что делать.
https://godbolt.org/z/fT1oondqs
Но это в принципе, а в общем случае, что будет, если мы подскажем не всё?
https://godbolt.org/z/K5qjYW4d1
Тут мнения gcc и clang расходятся. Один компилятор (gcc) считает, что ему подсказали достаточно. Другой (clang) говорит "candidate template ignored: couldn't infer template argument 'U'".
А вы что скажете? Как обычно ожидаются ссылки на стандарт.
#questions
В принципе с этим нет проблем, особенно если мы подсказываем что делать.
int bar(int) { return 0; }
int bar(double) { return 1; }
template <typename T>
int foo(T t, int (*)(T)) { return bar(t); }
foo(42, &bar); // OK, T -> inthttps://godbolt.org/z/fT1oondqs
Но это в принципе, а в общем случае, что будет, если мы подскажем не всё?
int bar(int, char) { return 0; }
int bar(double, long) { return 1; }
template <typename T, typename U>
int foo(T t, int (*)(T, U)) { return bar(t, 0); }
foo(42, &bar); // OK?https://godbolt.org/z/K5qjYW4d1
Тут мнения gcc и clang расходятся. Один компилятор (gcc) считает, что ему подсказали достаточно. Другой (clang) говорит "candidate template ignored: couldn't infer template argument 'U'".
А вы что скажете? Как обычно ожидаются ссылки на стандарт.
#questions
godbolt.org
Compiler Explorer - C++
int bar(int) { return 0; }
int bar(double) { return 1; }
template <typename T>
int foo(T t, int (*)(T)) { return bar(t); }
int main() {
return foo(42, &bar);
}
int bar(double) { return 1; }
template <typename T>
int foo(T t, int (*)(T)) { return bar(t); }
int main() {
return foo(42, &bar);
}
🤔30❤10👍5❤🔥1🤮1
Первая лекция второй части моего англоязычного курса по С++ доступна на Youtube.
https://www.youtube.com/watch?v=Q3ytjLP5NyA
Эта лекция начинает глубокое погружение в аллокаторы C++. Мы начнём с глобального (C-style) выделения памяти и исторической мотивации появления пользовательских аллокаторов в раннем C++. Затем разберём две фундаментальные проблемы их дизайна -- взаимозаменяемость и переход между разными типами аллокаторов. Через серию практических примеров -- включая freelist allocator -- мы исследуем, что именно идет не так на практике, почему дизайн аллокаторов оказывается неожиданно тонким и сложным, и как разделяемое состояние и правила продвижения аллокаторов усложняют реализацию контейнеров. Далее мы рассмотрим идею отделения стратегии выделения памяти от самих контейнеров, закладывая основу arena-based подхода, и проанализируем проблемы управления локальными аллокаторами внутри контейнеров. Эти проблемы впоследствии мотивировали изменения стандарта, но это мы оставим на следующую лекцию.
Timeline:
00:00 Начало. Пара слов про глобальные (C-style) аллокаторы.
04:51 Мотивация аллокаторов в раннем C++
09:49 Две важные проблемы: Interchangability и Rebinding
14:43 Logging Allocator Case Study
19:25 Weasel Words and C++11 Allocators Motivation
28:10 Case Study: Freelist Allocator и его проблемы
40:04 Разбор и починка причин проблем: Shared Freelist
52:10 Separating Resource: основы Arena-Based подхода
55:00 Case Study: Small Vector
01:01:38 Allocator Instances Hell: Halpern's Case and Scoped Allocators
01:08:26 Проблемы классических аллокаторов, тизер на следующую лекцию и список литературы.
#cpp_postgraduate
https://www.youtube.com/watch?v=Q3ytjLP5NyA
Эта лекция начинает глубокое погружение в аллокаторы C++. Мы начнём с глобального (C-style) выделения памяти и исторической мотивации появления пользовательских аллокаторов в раннем C++. Затем разберём две фундаментальные проблемы их дизайна -- взаимозаменяемость и переход между разными типами аллокаторов. Через серию практических примеров -- включая freelist allocator -- мы исследуем, что именно идет не так на практике, почему дизайн аллокаторов оказывается неожиданно тонким и сложным, и как разделяемое состояние и правила продвижения аллокаторов усложняют реализацию контейнеров. Далее мы рассмотрим идею отделения стратегии выделения памяти от самих контейнеров, закладывая основу arena-based подхода, и проанализируем проблемы управления локальными аллокаторами внутри контейнеров. Эти проблемы впоследствии мотивировали изменения стандарта, но это мы оставим на следующую лекцию.
Timeline:
00:00 Начало. Пара слов про глобальные (C-style) аллокаторы.
04:51 Мотивация аллокаторов в раннем C++
09:49 Две важные проблемы: Interchangability и Rebinding
14:43 Logging Allocator Case Study
19:25 Weasel Words and C++11 Allocators Motivation
28:10 Case Study: Freelist Allocator и его проблемы
40:04 Разбор и починка причин проблем: Shared Freelist
52:10 Separating Resource: основы Arena-Based подхода
55:00 Case Study: Small Vector
01:01:38 Allocator Instances Hell: Halpern's Case and Scoped Allocators
01:08:26 Проблемы классических аллокаторов, тизер на следующую лекцию и список литературы.
#cpp_postgraduate
YouTube
Lecture 15. Allocators I: Fine Tuning of Containers (MIPT, 2025-2026).
Master's degree lectures at MIPT on modern C++ in English. Department of Microprocessor Technologies.
This lecture begins a deep dive into C++ allocators. We start with global (C-style) memory allocation and the historical motivation for introducing custom…
This lecture begins a deep dive into C++ allocators. We start with global (C-style) memory allocation and the historical motivation for introducing custom…
🔥35👍21❤14🤮1
Провёл вторую встречу с подписчиками.
https://boosty.to/cpp_lects_rus/posts/949347c9-27ef-405a-8452-205954a7e25a
Получилось всё так же тепло и лампово, как мне кажется. Что логично, учитывая лимитированность аудитории платными подписчиками. Решил также оставить запись пока в открытом доступе.
Notable timesteps:
12:15 Одна забавная деталь в примере на вывод типов из этого поста: https://t.me/cpp_lects_rus/343
48:22 Новый алерт в виде поняши.
01:18:35 Пара официальных заявлений насчёт Max и всего такого.
01:51:13 Разбор доклада Сергея Чеботарёва про модули. Кстати вот сам доклад: https://www.youtube.com/watch?v=09jrHMzFjCw
#official #author_event
https://boosty.to/cpp_lects_rus/posts/949347c9-27ef-405a-8452-205954a7e25a
Получилось всё так же тепло и лампово, как мне кажется. Что логично, учитывая лимитированность аудитории платными подписчиками. Решил также оставить запись пока в открытом доступе.
Notable timesteps:
12:15 Одна забавная деталь в примере на вывод типов из этого поста: https://t.me/cpp_lects_rus/343
48:22 Новый алерт в виде поняши.
01:18:35 Пара официальных заявлений насчёт Max и всего такого.
01:51:13 Разбор доклада Сергея Чеботарёва про модули. Кстати вот сам доклад: https://www.youtube.com/watch?v=09jrHMzFjCw
#official #author_event
👍30❤14🔥9🙏2🤮1
Выложил вторую часть лекции по аллокаторам на английском языке.
https://youtu.be/naiLRcS3chU
Эта лекция продолжает наше обсуждение аллокаторов в C++. Мы начнём с идеи memory_resource и внезапно выясним, что полиморфизм времени выполнения оказывается неожиданно удобным инструментом для его реализации. Затем мы разбираем стандартные ресурсы, поставляемые библиотекой — такие как monotonic и multipool resources — и посмотрим, как они используются через polymorphic_allocator и контейнеры семейства PMR. Далее мы реализуем простой тестовый memory resource, чтобы посмотреть, как именно проходят выделения памяти через PMR и что такое стандартный ресурс по умолчанию. После этого, на примере известного примера Пабло Халперна с односвязным списком, мы разберём, как аллокаторы взаимодействуют с дизайном контейнеров, включая вопросы big-five и правила распространения аллокаторов. В конце мы проведём сравнение стоимости разработки при различных подходах к абстракции аллокатора.
00:00 Introduction: runtime polymorphism for memory_resource
06:15 Standard resources: monotonic and multipool
12:15 Polymorphic allocator and PMR containers
19:16 Test memory_resource: PMR and the default resource
25:52 Halpern example: slist and its design details
31:40 Allocators and the Big Five for slist
40:22 Exception safety strikes back
46:00 Preserving noexcept in the move constructor
53:06 Why are we not afraid of virtual calls?
56:53 Halpern's table, final thoughts, and bibliography
#cpp_postgraduate
https://youtu.be/naiLRcS3chU
Эта лекция продолжает наше обсуждение аллокаторов в C++. Мы начнём с идеи memory_resource и внезапно выясним, что полиморфизм времени выполнения оказывается неожиданно удобным инструментом для его реализации. Затем мы разбираем стандартные ресурсы, поставляемые библиотекой — такие как monotonic и multipool resources — и посмотрим, как они используются через polymorphic_allocator и контейнеры семейства PMR. Далее мы реализуем простой тестовый memory resource, чтобы посмотреть, как именно проходят выделения памяти через PMR и что такое стандартный ресурс по умолчанию. После этого, на примере известного примера Пабло Халперна с односвязным списком, мы разберём, как аллокаторы взаимодействуют с дизайном контейнеров, включая вопросы big-five и правила распространения аллокаторов. В конце мы проведём сравнение стоимости разработки при различных подходах к абстракции аллокатора.
00:00 Introduction: runtime polymorphism for memory_resource
06:15 Standard resources: monotonic and multipool
12:15 Polymorphic allocator and PMR containers
19:16 Test memory_resource: PMR and the default resource
25:52 Halpern example: slist and its design details
31:40 Allocators and the Big Five for slist
40:22 Exception safety strikes back
46:00 Preserving noexcept in the move constructor
53:06 Why are we not afraid of virtual calls?
56:53 Halpern's table, final thoughts, and bibliography
#cpp_postgraduate
YouTube
Lecture 16. Allocators II: Memory Resources and PMR (MIPT, 2025-2026).
Master's degree lectures at MIPT on modern C++ in English. Department of Microprocessor Technologies.
This lecture continues our discussion of allocators in C++. We begin with the idea of memory_resource and soon discover that runtime polymorphism turns…
This lecture continues our discussion of allocators in C++. We begin with the idea of memory_resource and soon discover that runtime polymorphism turns…
🔥33❤10👍6🥰2🤮2
Выложил лекцию по умным указателям на английском языке.
https://youtu.be/6w_1HcLoeg4
В этой лекции мы обсудим умные указатели в C++ и то, как они помогают управлять различными ресурсами, включая память. Мы начнём с перечисления альтернатив, включающих семантику значения и разные виды умных указателей, и в ходе лекции разберём детали каждого из них. Отдельно мы остановимся на двух основных механизмах, предоставляемых стандартной библиотекой C++ -- уникальных указателях и разделяемых указателях. В случае уникальных указателей мы также протянем связь с прошлой лекцией и обсудим, как они взаимодействуют с аллокаторами. Для разделяемых указателей мы рассмотрим типичные проблемы общего владения: циклические ссылки, использование weak_ptr, aliasing-конструкторы, enable_shared_from_this, а также распространённые ошибки вроде создания нескольких контрольных блоков для одного объекта. Завершим лекцию несколькими тизерами применения разделяемых указателей в многопоточной среде.
00:00 Введение: семантика значения и альтернативы для умных указателей.
08:05 Некопируемые неперемещаемые значения и prvalue elision.
11:35 Перемещаемые объекты и их возврат из функций.
18:05 Тонкости make_unique и организация делетера.
25:16 Unique pointers и аллокаторы.
32:15 Мотивация и проектирование разделяемых указателей.
38:59 Проблема владения контрольным блоком и расползание разделяемых указателей по коду.
47:50 Ковариантность разделяемых указателей и снова делетеры.
56:30 Зацикливание разделяемых указателей и weak pointers.
01:04:22 Настоящая стоимость make_shared.
01:08:30 Тизеры относительно применения в многопоточности, список литературы, завершение.
#cpp_postgraduate
https://youtu.be/6w_1HcLoeg4
В этой лекции мы обсудим умные указатели в C++ и то, как они помогают управлять различными ресурсами, включая память. Мы начнём с перечисления альтернатив, включающих семантику значения и разные виды умных указателей, и в ходе лекции разберём детали каждого из них. Отдельно мы остановимся на двух основных механизмах, предоставляемых стандартной библиотекой C++ -- уникальных указателях и разделяемых указателях. В случае уникальных указателей мы также протянем связь с прошлой лекцией и обсудим, как они взаимодействуют с аллокаторами. Для разделяемых указателей мы рассмотрим типичные проблемы общего владения: циклические ссылки, использование weak_ptr, aliasing-конструкторы, enable_shared_from_this, а также распространённые ошибки вроде создания нескольких контрольных блоков для одного объекта. Завершим лекцию несколькими тизерами применения разделяемых указателей в многопоточной среде.
00:00 Введение: семантика значения и альтернативы для умных указателей.
08:05 Некопируемые неперемещаемые значения и prvalue elision.
11:35 Перемещаемые объекты и их возврат из функций.
18:05 Тонкости make_unique и организация делетера.
25:16 Unique pointers и аллокаторы.
32:15 Мотивация и проектирование разделяемых указателей.
38:59 Проблема владения контрольным блоком и расползание разделяемых указателей по коду.
47:50 Ковариантность разделяемых указателей и снова делетеры.
56:30 Зацикливание разделяемых указателей и weak pointers.
01:04:22 Настоящая стоимость make_shared.
01:08:30 Тизеры относительно применения в многопоточности, список литературы, завершение.
#cpp_postgraduate
YouTube
Lecture 17. Smart Pointers: Resource Management (MIPT, 2025-2026).
Master's degree lectures at MIPT on modern C++ in English. Department of Microprocessor Technologies.
In this lecture we discuss smart pointers in C++ and how they help manage various resources, including memory. We begin by listing the main alternatives…
In this lecture we discuss smart pointers in C++ and how they help manage various resources, including memory. We begin by listing the main alternatives…
👍41❤15🔥11🤮1
Всем привет. Выложил главы 1.4 -- 1.6 и задания к первому разделу для моей книги про C++
https://boosty.to/cpp_lects_rus/posts/eeee2a76-c1be-46e5-a248-c8c1eb62fae8
Также обновил пост с главами 1.1 -- 1.3. Для тех кто уже купил можно бесплатно перескачать и я рекомендую это сделать, там есть изменения.
https://boosty.to/cpp_lects_rus/posts/5029d95f-831c-4262-9002-19ce8ea5208a
Спасибо всем моим подписчикам на boosty за поддержку которая вдохновляет меня работать над этой книгой и подписчикам уровня principal за участие в ревью.
Если вы ещё не подписались, рассмотрите возможность это сделать. Минимальная подписка это совсем недорого. Ну и конечно буду рад отзывам комментариям и предложениям и на boosty и здесь в комментариях к посту.
#cppbook #boosty
https://boosty.to/cpp_lects_rus/posts/eeee2a76-c1be-46e5-a248-c8c1eb62fae8
Также обновил пост с главами 1.1 -- 1.3. Для тех кто уже купил можно бесплатно перескачать и я рекомендую это сделать, там есть изменения.
https://boosty.to/cpp_lects_rus/posts/5029d95f-831c-4262-9002-19ce8ea5208a
Спасибо всем моим подписчикам на boosty за поддержку которая вдохновляет меня работать над этой книгой и подписчикам уровня principal за участие в ревью.
Если вы ещё не подписались, рассмотрите возможность это сделать. Минимальная подписка это совсем недорого. Ну и конечно буду рад отзывам комментариям и предложениям и на boosty и здесь в комментариях к посту.
#cppbook #boosty
❤53👍23🔥18🙏3
Выложил лекцию по динамическому полиморфизму на английском языке.
https://youtu.be/-hAxKYFY_7c
В этой лекции мы поговорим про динамический полиморфизм в C++ -- одну из самых неоднозначных и часто неправильно понимаемых тем языка. Мы обсудим, зачем он вообще нужен, какие реальные задачи он решает и почему полностью отказаться от него не получается. Разберём классическую реализацию через виртуальные функции, их стоимость, ограничения и подводные камни -- включая множественное наследование, RTTI и dynamic_cast. Далее мы рассмотрим альтернативы: CRTP и ручное управление таблицами диспетчеризации, их плюсы и минусы. В конце придём к более современным подходам -- инверсии полиморфизма и семантике значения в духе Шона Парента, где динамический полиморфизм скрыт внутри и не протекает в пользовательский код. Лекция оставляет открытым вопрос о том, как же правильно сочетать языковые механизмы и библиотечные абстракции и есть ли у динамического полиморфизма окончательное решение в современном C++.
00:00 Введение, мотивация для динамического полиморфизма.
03:40 Виртуальные функции и полиморфные интерфейсы.
12:22 Альтернатива: интерфейсы через CRTP.
16:25 CRTP mixins и немного deducing this.
24:45 Множественное наследование и симметрия RTTI-механизмов.
31:00 Виртуальное наследование.
37:06 dynamic_cast и его три смысла.
46:45 Снова о мотивации рантайм-полиморфизма и критика виртуальных функций.
51:18 Проблема Дионне и её разнообразные решения.
01:00:50 Решение Шона Парента: переиспользование и скрытие полиморфизма.
01:04:00 Открытый финал и список литературы.
#cpp_postgraduate
https://youtu.be/-hAxKYFY_7c
В этой лекции мы поговорим про динамический полиморфизм в C++ -- одну из самых неоднозначных и часто неправильно понимаемых тем языка. Мы обсудим, зачем он вообще нужен, какие реальные задачи он решает и почему полностью отказаться от него не получается. Разберём классическую реализацию через виртуальные функции, их стоимость, ограничения и подводные камни -- включая множественное наследование, RTTI и dynamic_cast. Далее мы рассмотрим альтернативы: CRTP и ручное управление таблицами диспетчеризации, их плюсы и минусы. В конце придём к более современным подходам -- инверсии полиморфизма и семантике значения в духе Шона Парента, где динамический полиморфизм скрыт внутри и не протекает в пользовательский код. Лекция оставляет открытым вопрос о том, как же правильно сочетать языковые механизмы и библиотечные абстракции и есть ли у динамического полиморфизма окончательное решение в современном C++.
00:00 Введение, мотивация для динамического полиморфизма.
03:40 Виртуальные функции и полиморфные интерфейсы.
12:22 Альтернатива: интерфейсы через CRTP.
16:25 CRTP mixins и немного deducing this.
24:45 Множественное наследование и симметрия RTTI-механизмов.
31:00 Виртуальное наследование.
37:06 dynamic_cast и его три смысла.
46:45 Снова о мотивации рантайм-полиморфизма и критика виртуальных функций.
51:18 Проблема Дионне и её разнообразные решения.
01:00:50 Решение Шона Парента: переиспользование и скрытие полиморфизма.
01:04:00 Открытый финал и список литературы.
#cpp_postgraduate
🔥52❤10😱8👍3
Выложил первую лекцию по многопоточности на английском языке.
https://youtu.be/Z5BJyUfPivg
В этой лекции мы начнём длинный путь в многопоточность на C++. Мы стартуем с самых основ. Обсудим, что такое поток исполнения в модели языка, чем логическая многопоточность отличается от аппаратного параллелизма, что такое область памяти и как возникает гонка данных. Разберём, почему наивные решения, вроде volatile или привязки потоков к ядрам, не решают проблему синхронизации. Далее мы перейдём к базовым примитивам синхронизации -- мьютексам -- и обсудим, как их использовать с помощью RAII. Нам придётся ввести концепцию безопасности относительно потоков, подобно тому, как в языке существует понятие безопасности относительно исключений. На примере простого буфера мы увидим, как легко получить ошибки проектирования даже при "очевидной" защите довольно простого класса, и введём понятие API race. В завершение мы рассмотрим одну из классических проблем -- дедлоки -- и разберём задачу об обедающих философах как иллюстрацию того, насколько сложной может быть корректная синхронизация и как язык C++ нас в этом поддерживает.
Timeline
00:00 Введение. Что такое поток исполнения?
08:14 Области памяти и гонка (data race).
14:18 Немного про volatile и почему это плохое решение.
18:38 Немного про POSIX affinity и почему это плохое решение.
26:00 Базовая синхронизация: mutex.
30:43 Безопасность относительно исключений и безопасность относительно потоков.
37:07 Попытка построить thread-safe буфер.
41:45 API races как проблема проектирования безопасных контейнеров.
52:20 Deadlocks и Dining Philosophers.
01:00:06 Завершение и список литературы.
#cpp_postgraduate
https://youtu.be/Z5BJyUfPivg
В этой лекции мы начнём длинный путь в многопоточность на C++. Мы стартуем с самых основ. Обсудим, что такое поток исполнения в модели языка, чем логическая многопоточность отличается от аппаратного параллелизма, что такое область памяти и как возникает гонка данных. Разберём, почему наивные решения, вроде volatile или привязки потоков к ядрам, не решают проблему синхронизации. Далее мы перейдём к базовым примитивам синхронизации -- мьютексам -- и обсудим, как их использовать с помощью RAII. Нам придётся ввести концепцию безопасности относительно потоков, подобно тому, как в языке существует понятие безопасности относительно исключений. На примере простого буфера мы увидим, как легко получить ошибки проектирования даже при "очевидной" защите довольно простого класса, и введём понятие API race. В завершение мы рассмотрим одну из классических проблем -- дедлоки -- и разберём задачу об обедающих философах как иллюстрацию того, насколько сложной может быть корректная синхронизация и как язык C++ нас в этом поддерживает.
Timeline
00:00 Введение. Что такое поток исполнения?
08:14 Области памяти и гонка (data race).
14:18 Немного про volatile и почему это плохое решение.
18:38 Немного про POSIX affinity и почему это плохое решение.
26:00 Базовая синхронизация: mutex.
30:43 Безопасность относительно исключений и безопасность относительно потоков.
37:07 Попытка построить thread-safe буфер.
41:45 API races как проблема проектирования безопасных контейнеров.
52:20 Deadlocks и Dining Philosophers.
01:00:06 Завершение и список литературы.
#cpp_postgraduate
YouTube
Lecture 19. Concurrency I: Basic Synchronization (MIPT, 2025-2026).
Master's degree lectures at MIPT on modern C++ in English. Department of Microprocessor Technologies.
In this lecture, we begin a long journey into multithreading in C++. We start from the very basics. We discuss what a thread of execution is in the language…
In this lecture, we begin a long journey into multithreading in C++. We start from the very basics. We discuss what a thread of execution is in the language…
👍50🔥34❤7
Всем привет. Очередной стрим для подписчиков проведу на boosty 5 апреля в 19 часов по Москве.
Планируется к детальному обсуждению программа предстоящей C++ Russia (благо она уже есть и собрана). Кроме того обсудим главы 1.4 -- 1.6 и расскажу как идёт работа над второй частью книги.
Ссылки на предыдущие стримы:
1. https://t.me/cpp_lects_rus/338
2. https://t.me/cpp_lects_rus/346
Ссылку на стрим заброшу в чат в воскресенье днём. Стрим будет по студенческому доступу. Вопросы можно накидывать уже сейчас:
https://www.donationalerts.com/r/cpp_lects_rus
#official #boosty
Планируется к детальному обсуждению программа предстоящей C++ Russia (благо она уже есть и собрана). Кроме того обсудим главы 1.4 -- 1.6 и расскажу как идёт работа над второй частью книги.
Ссылки на предыдущие стримы:
1. https://t.me/cpp_lects_rus/338
2. https://t.me/cpp_lects_rus/346
Ссылку на стрим заброшу в чат в воскресенье днём. Стрим будет по студенческому доступу. Вопросы можно накидывать уже сейчас:
https://www.donationalerts.com/r/cpp_lects_rus
#official #boosty
🔥25❤🔥8🙏2❤1🌭1
Выложил вторую лекцию по многопоточности на английском языке.
https://youtu.be/kup0qSuJTKM
Во второй лекции мы продолжим разбирать примитивы синхронизации в C++ и перейдём от базовых мьютексов к более сложным механизмам взаимодействия между потоками. Начнём мы с одноразовых событий и связанного с ними классического антипаттерна DCL. Далее мы рассмотрим передачу сигналов между потоками, введём для этого условные переменные и разберём типичные подводные камни, включая спонтанные пробуждения и связанные с ними ошибки. Отдельно обсудим, почему такие ошибки сложно отлаживать и как в этом помогает инструмент strace. Затем мы рассмотрим разделяемые блокировки, обсудим модель их использования и разберём, почему они не являются бесплатным ускорением. В завершение нас ждут ещё несколько антипаттернов, включая рекурсивные мьютексы и мьютексы с ограничением времени. Также мы оценим реальные размеры примитивов синхронизации и их влияние на производительность.
Timeline
00:00 Введение. Одноразовые события.
04:50 Антипаттерн DCL и решение через std::once_flag
12:50 Условные переменные и коммуникация между потоками.
19:15 Внезапные пробуждения на условных переменных.
27:14 Проблемы отладки и полезность strace.
31:22 Разделяемые блокировки.
37:45 Бенчмаркинг разделяемых блокировок: no free lunch.
43:04 Бенчмаркинг: лучший случай для разделяемых блокировок.
50:38 Антипаттерны: recursive_mutex и timed_mutex.
55:47 Размер основных примитивов, завершение, литература.
#cpp_postgraduate
https://youtu.be/kup0qSuJTKM
Во второй лекции мы продолжим разбирать примитивы синхронизации в C++ и перейдём от базовых мьютексов к более сложным механизмам взаимодействия между потоками. Начнём мы с одноразовых событий и связанного с ними классического антипаттерна DCL. Далее мы рассмотрим передачу сигналов между потоками, введём для этого условные переменные и разберём типичные подводные камни, включая спонтанные пробуждения и связанные с ними ошибки. Отдельно обсудим, почему такие ошибки сложно отлаживать и как в этом помогает инструмент strace. Затем мы рассмотрим разделяемые блокировки, обсудим модель их использования и разберём, почему они не являются бесплатным ускорением. В завершение нас ждут ещё несколько антипаттернов, включая рекурсивные мьютексы и мьютексы с ограничением времени. Также мы оценим реальные размеры примитивов синхронизации и их влияние на производительность.
Timeline
00:00 Введение. Одноразовые события.
04:50 Антипаттерн DCL и решение через std::once_flag
12:50 Условные переменные и коммуникация между потоками.
19:15 Внезапные пробуждения на условных переменных.
27:14 Проблемы отладки и полезность strace.
31:22 Разделяемые блокировки.
37:45 Бенчмаркинг разделяемых блокировок: no free lunch.
43:04 Бенчмаркинг: лучший случай для разделяемых блокировок.
50:38 Антипаттерны: recursive_mutex и timed_mutex.
55:47 Размер основных примитивов, завершение, литература.
#cpp_postgraduate
YouTube
Lecture 20. Concurrency II: Lock-Based Primitives (MIPT, 2025-2026).
Master's degree lectures at MIPT on modern C++ in English. Department of Microprocessor Technologies.
In the second lecture, we continue exploring synchronization primitives in C++ and move from basic mutexes to more advanced mechanisms for interaction between…
In the second lecture, we continue exploring synchronization primitives in C++ and move from basic mutexes to more advanced mechanisms for interaction between…
❤22🔥16👍11🌚1🌭1
Ссылка на прошедший стрим: https://boosty.to/cpp_lects_rus/posts/234e9b91-2ae5-4701-9586-be7705f79a72
Студенческий доступ я сохраню, всё-таки многое там я слишком прямо говорю для совсем уж публичного доступа.
Те моменты до которых вы можете захотеть прицельно долистать:
00:25:30 Несколько саркастический обзор программы магистратуры ИТМО.
00:52:15 Немного про инфоцыган. Мой несостоявшийся 18-летний продюсер и его офигенные картинки.
02:24:00 Обзор сформированной программы C++Russia, куда я пойду, куда нет.
—-
Немного забавного take-away.
На стриме был задан интересный вопрос. Я его докрутил до следующего примера.
Компилятору в этом коде кажется ничто не мешает трансформировать его примерно так:
И тем самым создать UB (data race).
В лямбду уходит указатель, он не пересекается как область памяти, happens-before вроде нет и т.п.
—
На стриме я задумался и не нашёл что сказать, но сейчас после стрима я почитал стандарт и внезапно мы тут защищены.
https://eel.is/c%2B%2Bdraft/thread.thread.constr#6
Так что happens-before всё-таки есть, кто бы мог подумать ))
Дмитрий, который задавал вопрос, FYI.
#boosty #questions
Студенческий доступ я сохраню, всё-таки многое там я слишком прямо говорю для совсем уж публичного доступа.
Те моменты до которых вы можете захотеть прицельно долистать:
00:25:30 Несколько саркастический обзор программы магистратуры ИТМО.
00:52:15 Немного про инфоцыган. Мой несостоявшийся 18-летний продюсер и его офигенные картинки.
02:24:00 Обзор сформированной программы C++Russia, куда я пойду, куда нет.
—-
Немного забавного take-away.
На стриме был задан интересный вопрос. Я его докрутил до следующего примера.
int x;
int *p = &x;
x = 0;
std::thread t([p]{ *p = 42; });
t.join();
use(x);
Компилятору в этом коде кажется ничто не мешает трансформировать его примерно так:
int x;
int *p = &x;
std::thread t([p]{ *p = 42; });
x = 0;
t.join();
use(x);
И тем самым создать UB (data race).
В лямбду уходит указатель, он не пересекается как область памяти, happens-before вроде нет и т.п.
—
На стриме я задумался и не нашёл что сказать, но сейчас после стрима я почитал стандарт и внезапно мы тут защищены.
The completion of the invocation of the constructor synchronizes with the beginning of the invocation of the copy of f.
https://eel.is/c%2B%2Bdraft/thread.thread.constr#6
Так что happens-before всё-таки есть, кто бы мог подумать ))
Дмитрий, который задавал вопрос, FYI.
#boosty #questions
❤42👍21🔥4🤯2😱2👎1🙏1🌭1
Выложил лекцию по многопоточным очередям на английском языке.
https://www.youtube.com/watch?v=86aNZgS9SOU
В этой лекции мы завершаем обсуждение lock-based примитивов синхронизации в C++ и подводим итог всему, что связано с классическим многопоточным программированием на мьютексах и condition variables. Мы рассмотрим producer–consumer паттерн, реализуем ограниченные MPMC-структуры (стек и очередь), разберём типичные проблемы таких решений и попробуем их исправить. Отдельно обсудим, почему даже "правильные" на первый взгляд интерфейсы могут приводить к потере задач. Далее перейдём к более выразительным механизмам коммуникации между потоками: future/promise, обработке исключений, packaged_task и std::jthread. Посмотрим, как современные абстракции позволяют писать более чистый и безопасный код. В завершение попробуем объединить всё вместе и построить очередь с произвольными задачами.
Timeline
00:00 Введение. Ментальная модель мьютекса.
06:33 Thread-Safe Lock-Based Bounded MPMC Stack.
11:01 Измеряем производительность и обнаруживаем проблему.
18:00 Пробуем пофиксить проблему: Wake and Done.
22:30 Thread-Safe Lock-Based Bounded MPMC Queue.
29:00 Критика интерфейса: очередь, которая не может не терять задачи.
33:46 Что если мы позволим неограниченный размер?
36:52 Возврат данных из потока и механизм future/promise.
42:45 Обработка исключений в потоках.
46:43 Packaged Tasks and Joinable Threads.
51:28 Проблема постановки барьера.
57:46 MPMC Queue с произвольными задачами.
01:03:26 Задача на подумать и список литературы.
#cpp_postgraduate
https://www.youtube.com/watch?v=86aNZgS9SOU
В этой лекции мы завершаем обсуждение lock-based примитивов синхронизации в C++ и подводим итог всему, что связано с классическим многопоточным программированием на мьютексах и condition variables. Мы рассмотрим producer–consumer паттерн, реализуем ограниченные MPMC-структуры (стек и очередь), разберём типичные проблемы таких решений и попробуем их исправить. Отдельно обсудим, почему даже "правильные" на первый взгляд интерфейсы могут приводить к потере задач. Далее перейдём к более выразительным механизмам коммуникации между потоками: future/promise, обработке исключений, packaged_task и std::jthread. Посмотрим, как современные абстракции позволяют писать более чистый и безопасный код. В завершение попробуем объединить всё вместе и построить очередь с произвольными задачами.
Timeline
00:00 Введение. Ментальная модель мьютекса.
06:33 Thread-Safe Lock-Based Bounded MPMC Stack.
11:01 Измеряем производительность и обнаруживаем проблему.
18:00 Пробуем пофиксить проблему: Wake and Done.
22:30 Thread-Safe Lock-Based Bounded MPMC Queue.
29:00 Критика интерфейса: очередь, которая не может не терять задачи.
33:46 Что если мы позволим неограниченный размер?
36:52 Возврат данных из потока и механизм future/promise.
42:45 Обработка исключений в потоках.
46:43 Packaged Tasks and Joinable Threads.
51:28 Проблема постановки барьера.
57:46 MPMC Queue с произвольными задачами.
01:03:26 Задача на подумать и список литературы.
#cpp_postgraduate
🔥38👍10❤6💩1
Минутка дружественного пиара.
В компании YADRO стартовал набор на программу стажировки Импульс. В этом году открыто более 30 направлений.
В том числе:
* Разработка на C++.
* C, системное программирование.
* Тестирование.
* Математика и алгоритмы.
* и много чего ещё.
Возможна удалёнка или гибрид.
Детали можно узнать на вебинарах 16 и 23 апреля. Регистрация уже доступна на сайте.
https://edu.yadro.com/impulse
#official
В компании YADRO стартовал набор на программу стажировки Импульс. В этом году открыто более 30 направлений.
В том числе:
* Разработка на C++.
* C, системное программирование.
* Тестирование.
* Математика и алгоритмы.
* и много чего ещё.
Возможна удалёнка или гибрид.
Детали можно узнать на вебинарах 16 и 23 апреля. Регистрация уже доступна на сайте.
https://edu.yadro.com/impulse
#official
👍62🔥24💊7🤣4🥴2😁1
Выложил первую лекцию по атомикам на английском языке.
https://youtu.be/dRlOwdj8BHI
В этой лекции мы начнём переход к настоящему lock-free программированию. Для этого нам понадобится серьёзная база в атомиках C++. Первое, что мы сделаем в начале лекции, -- это мотивируем атомик через конкретный пример контрольного блока shared_ptr и убедительный бенчмаркинг. Далее, рассматривая обычный инкремент, мы изобретём идиому Compare-And-Swap (CAS). Центральным понятием лекции является lock-freeness. Мы разберём иерархию гарантий прогресса, а также вернёмся к классическим антипаттернам, вроде double-checked locking, и покажем, как их корректно реализовать с помощью атомиков. Отдельно обсудим статическую инициализацию и thread-local переменные. Во второй половине лекции мы перейдём к более сложной теме -- API races. Посмотрим, как такие ошибки возникают даже при использовании атомиков, и почему их сложно обнаружить, в частности обсудим подход через формальную верификацию. Закончим мы разбором ситуаций активной блокировки.
Timeline
00:00 Intro. Контрольный блок для разделяемого указателя и снова data race.
04:30 Проблема контрольного блока. Бенчмаркинг atomic vs mutex.
10:25 Дуальность синхронизации. Какой единственный тип должен быть действительно атомарным.
17:30 Проблема инкремента для аомика. Мотивация для CAS.
28:24 Концепция lock-freeness и иерархия свободы.
38:45 Снова антипаттерн DCL. Чиним через атомики.
45:10 Синглтон Майерса: синхронизация вокруг статических переменных. Thread local переменные.
50:15 Снова Copy On Write: проблемы в простом COW подходе.
56:57 Поиск API Races в коде, активно использующем атомики.
01:04:30 Методы формальной верификации для поиска API races.
01:08:46 Завершение: livelocks и литература.
#cpp_postgraduate
https://youtu.be/dRlOwdj8BHI
В этой лекции мы начнём переход к настоящему lock-free программированию. Для этого нам понадобится серьёзная база в атомиках C++. Первое, что мы сделаем в начале лекции, -- это мотивируем атомик через конкретный пример контрольного блока shared_ptr и убедительный бенчмаркинг. Далее, рассматривая обычный инкремент, мы изобретём идиому Compare-And-Swap (CAS). Центральным понятием лекции является lock-freeness. Мы разберём иерархию гарантий прогресса, а также вернёмся к классическим антипаттернам, вроде double-checked locking, и покажем, как их корректно реализовать с помощью атомиков. Отдельно обсудим статическую инициализацию и thread-local переменные. Во второй половине лекции мы перейдём к более сложной теме -- API races. Посмотрим, как такие ошибки возникают даже при использовании атомиков, и почему их сложно обнаружить, в частности обсудим подход через формальную верификацию. Закончим мы разбором ситуаций активной блокировки.
Timeline
00:00 Intro. Контрольный блок для разделяемого указателя и снова data race.
04:30 Проблема контрольного блока. Бенчмаркинг atomic vs mutex.
10:25 Дуальность синхронизации. Какой единственный тип должен быть действительно атомарным.
17:30 Проблема инкремента для аомика. Мотивация для CAS.
28:24 Концепция lock-freeness и иерархия свободы.
38:45 Снова антипаттерн DCL. Чиним через атомики.
45:10 Синглтон Майерса: синхронизация вокруг статических переменных. Thread local переменные.
50:15 Снова Copy On Write: проблемы в простом COW подходе.
56:57 Поиск API Races в коде, активно использующем атомики.
01:04:30 Методы формальной верификации для поиска API races.
01:08:46 Завершение: livelocks и литература.
#cpp_postgraduate
YouTube
Lecture 22. Atomicity I: Lock-freeness and CAS (MIPT, 2025-2026).
Master's degree lectures at MIPT on modern C++ in English. Department of Microprocessor Technologies.
In this lecture, we begin the transition to real lock-free programming. To do this, we will need a solid foundation in C++ atomics. The first thing we do…
In this lecture, we begin the transition to real lock-free programming. To do this, we will need a solid foundation in C++ atomics. The first thing we do…
👍47🔥23❤7💩1
Съездил в Нижний Тагил по приглашению компании Iridi с лекцией по RAII. В частности рассказал что-то и про новые RAII-обёртки в C++26: std::polymorphic и std::indirect. К сожалению нормальной записи не велось, поэтому запись экрана выкладываю на правах черновика.
https://rutube.ru/video/491df36a93e245aaefa116026cf775ef
Timeline:
00:00 Введение. Инварианты классов.
07:58 Инкапсуляция и ряд смежных наблюдений.
14:23 Big-5 и безопасность исключений. Изобретаем RAII.
25:15 RAII и Value-семантика. Мотивируем std::polymorphic.
37:43 Детали std::polymorphic и делаем систему открытой.
43:20 Немного о некопируемых типах. RVO.
50:03 Некоторые советы по работе с unique pointers.
55:26 PImpl и мотивация для std::indirect.
58:32 Shared pointers и их проблемы.
01:03:25 Завершение: пара слов про интрузивные указатели, литература, первые пара вопросов.
Слайды: https://sourceforge.net/projects/cpp-lects-rus/files/conference-talks/raii.pdf/download
Получил в подарок удивительно тёплую толстовку (я в ней на фотографии) и прекрасную статуэтку работы местных мастеров.
Новость о событии на канале Iridi: https://t.me/iRidiummobileRu/2344
Спасибо Марату Гилязетдинову за его усилия в организации этой поездки и за короткую экскурсию по Тагилу после лекции.
P. S. Также недавно был в Йошкар-Оле но там слишком уж хорошая запись, так что пост выложу когда придёт время её выкладки на youtube.
P. P. S. Приближается лето — лучшая пора когда меня можно позвать в ваш город, в ваш университет или в офис вашей компании с лекцией, на встречу с читателями и т. п. Если вы человек, который способен организовать такого рода поездку (найти помещение, договориться с администрацией, привести аудиторию), пишите мне в лс.
#official #author_event
https://rutube.ru/video/491df36a93e245aaefa116026cf775ef
Timeline:
00:00 Введение. Инварианты классов.
07:58 Инкапсуляция и ряд смежных наблюдений.
14:23 Big-5 и безопасность исключений. Изобретаем RAII.
25:15 RAII и Value-семантика. Мотивируем std::polymorphic.
37:43 Детали std::polymorphic и делаем систему открытой.
43:20 Немного о некопируемых типах. RVO.
50:03 Некоторые советы по работе с unique pointers.
55:26 PImpl и мотивация для std::indirect.
58:32 Shared pointers и их проблемы.
01:03:25 Завершение: пара слов про интрузивные указатели, литература, первые пара вопросов.
Слайды: https://sourceforge.net/projects/cpp-lects-rus/files/conference-talks/raii.pdf/download
Получил в подарок удивительно тёплую толстовку (я в ней на фотографии) и прекрасную статуэтку работы местных мастеров.
Новость о событии на канале Iridi: https://t.me/iRidiummobileRu/2344
Спасибо Марату Гилязетдинову за его усилия в организации этой поездки и за короткую экскурсию по Тагилу после лекции.
P. S. Также недавно был в Йошкар-Оле но там слишком уж хорошая запись, так что пост выложу когда придёт время её выкладки на youtube.
P. P. S. Приближается лето — лучшая пора когда меня можно позвать в ваш город, в ваш университет или в офис вашей компании с лекцией, на встречу с читателями и т. п. Если вы человек, который способен организовать такого рода поездку (найти помещение, договориться с администрацией, привести аудиторию), пишите мне в лс.
#official #author_event
❤49🔥32👍13🤝2🙏1