- 61
- 257 975
Мещерин Илья
เข้าร่วมเมื่อ 23 เม.ย. 2012
t.me/yet_another_telegram_blog
Лекция 61 (последняя). Единицы трансляции. ODR. Внешнее и внутреннее связывание
Лекция 61 (последняя). Единицы трансляции. ODR. Внешнее и внутреннее связывание
มุมมอง: 3 666
วีดีโอ
Лекция 60. Constant expressions. Constexpr, consteval, std::is_constant_evaluated
มุมมอง 1.7K4 หลายเดือนก่อน
Лекция 60. Constant expressions. Constexpr, consteval, std::is_constant_evaluated
Лекция 59. std::launder. Strict aliasing. Constexpr переменные и функции
มุมมอง 1.5K4 หลายเดือนก่อน
Лекция 59. std::launder. Strict aliasing. Constexpr переменные и функции
Лекция 58. Внутреннее устройство std::variant и std::visit
มุมมอง 1.3K4 หลายเดือนก่อน
Лекция 58. Внутреннее устройство std::variant и std::visit
Лекция 57. Unions, std::variant, std::visit. Overload pattern
มุมมอง 1.4K4 หลายเดือนก่อน
Лекция 57. Unions, std::variant, std::visit. Overload pattern
Лекция 56. Проблемы std::function. std::bind, std::reference_wrapper
มุมมอง 1.5K4 หลายเดือนก่อน
Лекция 56. Проблемы std::function. std::bind, std::reference_wrapper
Лекция 55. std::function и ее реализация. std::invoke
มุมมอง 3K5 หลายเดือนก่อน
Лекция 55. std::function и ее реализация. std::invoke
Лекция 54. Объекты замыканий. Обобщенные лямбды. Рекурсивные лямбды.
มุมมอง 1.9K5 หลายเดือนก่อน
Лекция 54. Объекты замыканий. Обобщенные лямбды. Рекурсивные лямбды.
Лекция 53. Лямбда-функции. Списки захвата. Замыкания
มุมมอง 2.2K6 หลายเดือนก่อน
Лекция 53. Лямбда-функции. Списки захвата. Замыкания
Лекция 52. Концепты (окончание). Лямбда-функции (начало)
มุมมอง 1.4K6 หลายเดือนก่อน
Лекция 52. Концепты (окончание). Лямбда-функции (начало)
Лекция 51. Requires-выражения. Концепты
มุมมอง 1.5K6 หลายเดือนก่อน
Лекция 51. Requires-выражения. Концепты
Лекция 50. SFINAE-friendliness. Constraints and requirements
มุมมอง 1.6K6 หลายเดือนก่อน
Лекция 50. SFINAE-friendliness. Constraints and requirements
Лекция 49. Реализация type_traits с помощью SFINAE
มุมมอง 1.6K6 หลายเดือนก่อน
Лекция 49. Реализация type_traits с помощью SFINAE
Лекция 47. Type erasure, std::any. Окончание реализации shared_ptr
มุมมอง 2.5K6 หลายเดือนก่อน
Лекция 47. Type erasure, std::any. Окончание реализации shared_ptr
Лекция 46. Внутреннее устройство shared_ptr и weak_ptr
มุมมอง 3.4K6 หลายเดือนก่อน
Лекция 46. Внутреннее устройство shared_ptr и weak_ptr
Лекция 45. Tuple, идея реализации. Функции для работы с tuple
มุมมอง 2.1K7 หลายเดือนก่อน
Лекция 45. Tuple, идея реализации. Функции для работы с tuple
Лекция 44. Deducing this. CTAD. Structured bindings, tuples
มุมมอง 2.3K7 หลายเดือนก่อน
Лекция 44. Deducing this. CTAD. Structured bindings, tuples
Лекция 43. Вывод типов auto, decltype, decltype(auto)
มุมมอง 2.9K7 หลายเดือนก่อน
Лекция 43. Вывод типов auto, decltype, decltype(auto)
Лекция 42. Expired values. Copy elision. Return value optimization
มุมมอง 2.2K7 หลายเดือนก่อน
Лекция 42. Expired values. Copy elision. Return value optimization
Лекция 41. Реализация std::move и std::forward. Реализация push_back с move-семантикой
มุมมอง 2.8K7 หลายเดือนก่อน
Лекция 41. Реализация std::move и std::forward. Реализация push_back с move-семантикой
Лекция 40. Ссылочные квалификаторы. Универсальные ссылки. Функция std::forward
มุมมอง 3K7 หลายเดือนก่อน
Лекция 40. Ссылочные квалификаторы. Универсальные ссылки. Функция std::forward
Лекция 39. Функция std::move. Определения lvalue и rvalue. Rvalue-ссылки
มุมมอง 3.3K7 หลายเดือนก่อน
Лекция 39. Функция std::move. Определения lvalue и rvalue. Rvalue-ссылки
Лекция 38. Scoped allocators. Атрибуты. Move-семантика (начало)
มุมมอง 2.9K8 หลายเดือนก่อน
Лекция 38. Scoped allocators. Атрибуты. Move-семантика (начало)
Лекция 37. Разновидности и реализация operator new. Выравнивания. Битовые поля
มุมมอง 2.2K8 หลายเดือนก่อน
Лекция 37. Разновидности и реализация operator new. Выравнивания. Битовые поля
Лекция 36. Allocator-aware контейнеры. Перегрузка new и delete
มุมมอง 2.7K8 หลายเดือนก่อน
Лекция 36. Allocator-aware контейнеры. Перегрузка new и delete
Лекция 35. Аллокаторы, allocator_traits
มุมมอง 3.9K8 หลายเดือนก่อน
Лекция 35. Аллокаторы, allocator_traits
Лекция 34. Внутреннее устройство std::unordered_map
มุมมอง 2.3K8 หลายเดือนก่อน
Лекция 34. Внутреннее устройство std::unordered_map
Лекция 33. Потоковые итераторы. Манипуляторы над потоками
มุมมอง 2.1K8 หลายเดือนก่อน
Лекция 33. Потоковые итераторы. Манипуляторы над потоками
Лекция 32. Внутреннее устройство std::list и std::map
มุมมอง 3.9K8 หลายเดือนก่อน
Лекция 32. Внутреннее устройство std::list и std::map
кто-то знает какой плагин выводит так информацию? 1:00:37
Хочу дополнить рассказ одной ситуацией, с которой я сам столкнулся и которую Илья не проговаривает (или проговаривает, но я не заметил): При ромбовидном наследовании с использованием виртуального наследования в конструкторе класса Son нужно писать не два, а три делегирующих конструктора: бабушки, мамы и папы. Что вообще происходит, удобно показать на примере: struct A { A() = delete; A(const std::string& str) : a(1) { std::cout << "A() in " << str << ' '; } int a; }; struct B : virtual A { B() = delete; B(int) : A("B()"), b(2) { std::cout << "B() "; a = 2; } int b; }; struct C : virtual A { C() = delete; C(int) : A("C()"), c(3) { std::cout << "C() "; a = 3; } int c; }; struct D : B, C { D() = delete; D(int) : A("D()"), B(0), C(0), d(4) { std::cout << "D() "; } int d; }; int main() { D dd(0); std::cout << dd.a; } Вывод этой программы будет:""" A() in D() B() C() D() 3""" Общее правило такое: при вызове конструктора объекта, который находится в иерархии с виртуальным наследованием, каждый предок инициализируется только один раз при первой возможности. В соответствие с этим правилом, сначала вызывается конструктор А в списке инициализации D, потом вызывается конструктор B, и в его списке инициализации повторная инициализация А не происходит, но выполняется код в фигурных скобках, и в поле а записывается значение 2. Потом, думаю, понятно. Больше того, как я понял, если к какому-то предку нет пути, по которому встречается виртуальное наследование, то наследника нельзя будет создать, просто проинициализировав поля всех предков, надо именно вызывать делегирующие конструкторы, иначе компилятор выдает ошибку, что у наследника нет таких-то полей.
*если к какому-то предку нет пути, по которому НЕ встречается виртуальное наследование
Илья, привет, спасибо за отличный курс лекций. Скажи, пожалуйста, почему убрал их из общего доступа? Планируешь ли восстановить доступ или его можно получить? Курс лекций за последний год был очень хорош на твоем канале. Так как не знаю, как с тобой связаться, пишу через комментарии :)
Илья говорит про использование template + vector<T>::iterator. Не понял, данный пример, данный тип инициализируется без CE. Поясните пожалуйста, что я упустил. Спасибо. Нашел: template <typename T> void print_vector(std::vector<T>& vec) { // typename is needed here because 'iterator' depends on T (which is a template parameter) typename std::vector<T>::iterator it; for (it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; }
привет! а у тебя осталась ссылка где-то на плейлист? просто, как я понял, Илья скрыл видео, а я так и остался на 30 лекции.. вот по старым ссылкам и хожу из истории =(
а куда вдруг весь плейлист подевался? (эх, а я только приближаться к концу стал...)
Подскажите можно ли реализовать функцию print с помощью синтаксиса fold expression, вместе с отступами << ' ' ?
Можно через такой синтаксис ( pack op ... ) и бинарный оператор запятая template <typename... Types> void print(const Types&... types) { ((std::cout << types << ' '), ...); }
@@ddruip 😮😮😮спасибо
В лекции ошибка. В ControlBlock на самом деле лежит не T, а T*. При вызове std::make_shared мы действительно делаем одну аллокацию сразу под shared_ptr и под T. Таким образом, мы экономим аллокацию + ещё выигрываем в скорости из-за cache локальности
@@НикитаБахарев-ц8л "под shared_ptr и под T" - имеешь в виду под control block и под T? А в чем профит хранить в контрол блоке указатель, а не сам T?
@@mesyarik 1. - имеешь в виду под control block и под T? - да 2. - А в чем профит хранить в контрол блоке указатель, а не сам T? - T* хранится и в shared_ptr, и в ControlBlock (таким образом, мы делаем одно разыменование, если хотим получить T). Это нужно, чтобы корректно delete'ить объекты с множественным наследованием без виртуальных деструкторов. есть подробно на youtube: CppCon 2019: Arthur O'Dwyer “Back to Basics: Smart Pointers” а узнал я про это на одном из собесов)
Досадно, что плейлист исчез. В любом случае, спасибо за интересные лекции.
00:00 7.6 Exception safety 02:00 виды exception safety 11:20 noexpect, не бросаем исключения из самой функции 23:10 VIII Containers and iterators. 8.1 std::vector implementation 25:55 реализация push_back() 27:20 реализация reserve() 40:00 placement new 55:30 std::vector<bool> как контр пример
А почему на канале все видео пропали? У меня как раз в универе скоро будет c++, и очень хотелось бы пересмотреть ваши лекции.
Теперь они доступны только по ссылке
Ну куда вы лекции скрыли :(
И зачем? :(
00:00 Почему падают программы, структурная схема 06:30 7.3 Exception handling 11:50 бросаем исключение по значению 13:30 бросаем исключение по ссылке 24:00 бросаем throw из catch 24:35 вложенный try 30:50 ремарка про std::endl, о том, что он очищает буфер вывода 32:00 7.3 Multiple catch 34:00 правила преобразования типов при throw и catch 36:15 примеры с наследованием 42:30 7.4 Resource acquisition is initialization 50:00 пример smart pointer 54:15 реализация unique_ptr 1:00:00 7.5 Exceptions in constructors 1:12:35 function-try block, работает для любой функции и конструктора 1:19:30 нельзя бросать исключения из деструктора 1:23:20 std::uncaught_exceptions проверка летит ли исключение 1:24:30 про несколько исключений одновременно в runtime
00:00 6.9 Fold expressions since c++17 11:20 6.10 CRTP(Curiously recurring template pattern) 13:00 пример из вики как неочевидно использовать шаблоны 21:30 expression templates 30:40 7 Exceptions 32:00 7.1 Idea of exceptions, basic examples 39:50 throw 42:00 try, catch 51:30 new бросает std::bad_alloc 52:30 std::terminate 59:30 7.2 Difference between exceptions and runtime errors 1:08:10 иерархия стандартных исключений
не нормально, а идеально шикарно!!!!
Спасибо за лекции! Friend class Vector в итераторе не нужен разве? Если конструктор от указателя приватный, мы его не можем использовать внутри класса вектора
Лекции прошлых годов вернут на канал?
На C# есть ref struct, которые на стеке выделяются, которые могут вести себя как неуправлямые ресурсы, их ГК не трогает. Также unsafe код с указателями имеет fixed, который закрепляет указатель и его также не трогает ГК.
Не принято в современном мире называть родителей по номерам. Это раздутая из ничего чушь. Раздутая из какой-то формальной бумажки в одной стране. Одному деду кто-то это сказал, дед сам интернетом пользоваться не умеет, и начал повторять это везде.
А где взять задачи которые вы даете студентам?
концовка - просто ахуеть
В последнем примере msvc cpp14 вывел 106 85 54 32, а cpp17 вывел 21 52 74 106.
Где vptr у сына? Или его хранят только прямые предки, и все обращения к полям и методам бабушки проходят через них?
А разве одиночных логических операторов нет, которые гарантируют, что оба выражения вычисляться и сравняться? Которые "побитовые" в контексте булей.
1:11:13 Стандартная конверсия же предпочтительнее пользовательской? Тогда по такой логике должна быть не CE, а 2, хоть на самом деле 1, ведь сама логика не верна.
Уб с интом и ll прежде всего потому, что есть little и big endian архитектуры, и при касте указателя интовый может на одном компе указывать на младшие разряды, а на другом -- на старшие
Оставлю этот комментарий для таких же "Окошников" как и я, короче, если вы любите все проверять своими ручками и не понимаете, почему ничего не получается, знайте, вижловский компилятор, по каким-то не ведомым причинам, считает себя самым хитрым и умным, и раздувает из мухи слона там, где это не надо, поэтому при множественном наследовании размеры класса sizeof(Son) с иерархией: Бабушка, от нее виртуально мама, папа, от них сын, у каждого виртуальный метод и целочисленное поле, из 48байт превращаются в 72
Это было прекрасно, спасибо. Булевый вектор отдельно взрывает мозг. То есть по факту мы создали временный объект, который лежит там же, где наш массив данных, поправили что-то и забыли. А массив поменялся!
Прогаю около 10 лет, в т.ч. 4 года профессионально на C#, VBA, JS, TSQL, Python, писал немного на Java, Scala, Fortran, ASM, C. Послушать все равно интересно, кучу всего из плюсов на виртуальные машины языков переместили уже.
00:00 6.6 Dependent names (зависимые имена) 09:33 применение typename 14:55 шаблонный тип в шаблоне 29:30 понятие Two phase translation 33:23 6.7 Metafunctions and type traits 33:30 метафункция is_same 43:00 метафункция remove_reference 45:30 метафункция remove_const 48:50 про <type_traits> 57:30 std::conditional 1:03:30 6.8 variadic templates 1:06:07 вариадический print на шаблоне 1:11:00 пример, is_homogeneous, проверяет все ли типы в функции одинаковые 1:19:00 оператор sizeof…()
какие душные ребята там сидят, ужас
true cpp devs
это физтех хуле
Кто-нибудь объясните пожалуйста почему в 26:17 в переопределенном операторе +, в месте, где возвращается объект VecSum, мы этот объект формируем разыменовывая указатели, полученные из статик каста? Почему мы не делаем статик каст к константной ссылке?
Спасибо большое, побольше таких видео ❤❤❤❤❤
00:00 6.3 template specialization 06:05 про перегрузку и шаблоны 13:10 снова про порядок перегрузки 16:30 6.4 non-type template parameters 23:00 пример использования числовых параметров шаблона 28:15 числовые параметры у классов 31:00 constexpr 34:00 tempate template parameters, шаблонные аргументы которые шаблоны 54:00 6.5 basic compile time cumputations 55:00 пример с числом Фибоначчи 1:02:26 проверка числа на простоту 1:08:35 шаблонные переменные 1:09:35 static_assert
1:19:58 В конструкторе копирования несколько ошибок.
21:46 std::shared_ptr<int> p(new int(5)); auto p2 = p; p2 = new int(8); Так незя, no operator "=" matches these operands
Почему в shared_ptr, отстуствует кастомный Deleter?
спасибо за лекции
Где-то на 1:03:00 поставил на паузу - проверить, какие конструкторы вызовутся, если у возвращаемой локальной переменной прописать и не прописать move. Получил S(S&&), думал, ходил, размышлял о жизни...
Здравствуйте. Очень класный курс лекций!!! Смотрю, и наслождаюсь от понимания) автору огромное спасибо! Илья, Я слышал, что вы раздумываете по поводу следующих курсов видеолекций и выбераете между: "приквылом" к этому курсу и следующей частъю этого( многопоточность, ОС и т.д.). Так вот, лично Я голосую за продолжение этого курса, а не за приквэл!) Моя логика такова: что если вы в самом первом ролике дадите литературу по которой можно освоить "базу" (Стивин Прато -Си, Андрей Столяров - Введение в професию) + другая литература. То люди с ней и сами разберуться. А вот что касается более сложных вещей, вы в этом курсе говарите про них "вам на 2ом курсе раскажут", тут без объяснений сташего и опытного товарища не обойтись... В общем! Если будете выберать, то Я за продолжение курса, а не "приквэл"! ☝️👍
@@Serch_404 продолжение уже планируется записать этой осенью))
@@mesyarik Это очень хорошая новость!) Ждём с нетерпением👍 И если можно, то есть одна просьба. Дайте пожалуйста, в первом или в заключительном ролике, полный список литературы, которая по вашему мнению поможет людям разобраться с материалом. Вот лично Мне, как бы не были хороши лекции, всё равно нужен хороший источник по теме. К которому Я смогу обратиться для уточнения, более детального изучения той или иной темы... В общем, если у вас есть "список литературы", то будьте так добры, поделитесь с аудиторией😅 Заранее спасибо🙏
@@mesyarik а куда пропали первый плейлист на канале?
Илья, хотел бы, чтобы вы сделали курс для начинающих
Трилогия столярова "программирование: введение в профессию" до главы про плюсы включительно -> потом этот курс
@@petrkiyashko4248 спасибо. Я уже видел подобные комментарии, но очень сложно себя заставить что-то делать, хоть и действительно есть желание. Я смотрю на то, какая толстая эта книга и становится больно от понимания того, как много времени нужно будет потратить
00:00 6 Templates 6.1 Idea of templates, basics examples. 6:30 шаблонная функция 9:10 <template T> vs <class T> 11:10 шаблонный класс 12:26 шаблонный using 17:20 шаблонная переменная, С++14 без примера 19:30 порядок использования шаблонов 22:20 важный момент, шаблоны это кодогенерация 25:30 хороший вопрос, но так не работает 36:35 6.2 Templates overloading 39:00 мотивация работы перегрузки 42:40 эвристика работы компилятора при выборе перегрузки 50:10 шаблонный аргумент по умолчанию 1:08:20 про шаблонные классы 1:09:30 специализация шаблона 1:16:50 full and partial specialization
*В свое время я участвовал в олимпиадах (те самые, что придумали как замену вступительным). Призер физтеха по физике, победа на ОММО и в итоге проходил по баллам в ВШЭ, Мехмат МГУ и на ПМИ в МФТИ, так как баллы были неплохие с олимпиадами (2016й год). Я тогда хотел стать математиком, потому что я её любил в школе (как же я ошибался), а в информатике мне нравился только Паскаль, из-за чего, увидев как выглядит ЕГЭ по информатике, желание в неё углубляться у меня пропало. День Х, я иду на почту с кипой доков для отправки их в ВШЭ и поступления на ПМИ, и, не доходя до почты я передумываю. Поступаю в свой УГАТУ на ПМИ, где с самого начала нас (140 человек на потоке) сталкивают 70 лет+ преподователи с советской программой линала, матана, функана, дискреткой и другими страшными словами. В 2 предметах в семестре помимо зачета и экзамена, ставятся 2 коллоквиума, не сдав которые - нет допуска даже к зачету. И зимой нас благополучно остается 40 человек в потоке из ТРËХ групп (из 140 человек изначально). Кое-как дожив до конца 1 курса и закрыв предметы я понимаю, что математику я так-то не очень и люблю. С и С++ на первом курсе даются мне плохо, и прямо на первой лекции функана, на 3 году обучения я принимаю решение перейти на другой факультет с понимжением на 1 курс, на Прикладную Информатику (другое не было доступно), в конец потеряв какой-либо огонь учиться чему либо, главное было не потерять год жизни в казарме. Как оказалось, на ПИ нет информатики, проги и математики, там учат строить схемы бизнес процессов, для автоматизации их в дальнейшем. Прошло 4 года, я пайтон программист с годовым стажем, смотрю этот курс по плюсам для личного развития и переодически злюсь на себя за то, что в свое время сделал не самый лучший выбор вуза и потерял несколько лет на поиск и осознание того, чем на самом деле хочу заниматься в жизни.... Цените то, куда вы попали.*
Если мы используем make_shared чтобы одним махом создавать и счетчики и объект, а потом создали weak_ptr, а потом при обнулении shared_count вызвали вручную деструктор объекта, то как мы избежим вызова деструктора второй раз при удалении контрольного блока, содержащего и счетчик и объект ?
внутри контрол блока лежит не сам объект, а массив чаров размера и выравнивания как объект
Back_insert_iterator делается через указатель на Container, а не через ссылку, потому что ссылки нельзя присваивать. Например, std::copy_if использует какой-то метод из std, который задействует оператор присваивания it1 = it2.
Классные лекции, но по поводу вызовов методов класса через указатели на методы, и вообще. Очень не хватает упоминания, что в такие методы (и все нестатические методы класса) неявно передаётся первым параметром указатель на объект (будущий this). Так вот, то самое смещение, которое хранится вторым - оно применяется именно к этому указателю, не на функцию, как в озвучке, а на неявно переданный указатель объекта. А указатель на метод никуда не сдвигается - каким был, таки и остался...
Привет, можешь объяснить, зачем два указателя, есть уже имеем указатель на метод, почему нельзя просто взять и вызвать его? А нужен ещё один для смещения, я вот не понимаю.
@@yophosphene914 Указатель на метод не "знает" для какого объекта класса он вызван, т.е. у тебя может быть сотня объектов, но указатель на метод у них будет один. Если метод статический, то ок, а если член класса, то нужно знать для какого объекта класса оно вызвано. Для этого первым параметром всегда передаются указатель на сам объект, который внутри можно получить, используя мнемонику this.
@@VengMike, кажется понял, спасибо большое!
00:00 5.6 memory layout of polymorphic objects with multiple inheritance 13:50 non virtual thunc 17:50 важная оговорка 18:30 virtual inheritance 26:00 заключение по теме 31:20 про блог shaharmike 32:50 5.7 no obvious problems with virtual functions 39:05 популярный вопрос на собесе 44:32 пример pure virtual function call 50:25 порядок создания полиморфного объекта 58:20 пример из ТОП3 кринж примеров, как работают ссылки не виртуальные методы
Супер лекции! Спасибо, что выложили
Про std endl немного неправильно то, что на линуксе как минимум ' ' флашит аутпут, только если это явно не выключить. Но это так для стандартных потоков ввода-вывода, а не для любых стримов.