-
Notifications
You must be signed in to change notification settings - Fork 16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Оглавление курса по C++ #158
base: main
Are you sure you want to change the base?
Conversation
cpp/contents.md
Outdated
- Неявное преобразование и explicit | ||
- Правило 3 (5) | ||
- Спецификаторы =default, =delete | ||
- Использование std::move(), std::forward() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
std::move
и особенно std::forward
странно рассматривать до rvalue
, lvalue
, прочих value и шаблонов.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Отрефакторено в спираль.
Теперь такой подход:
- RAII. Владение ресурсом.
- В некоторых случаях неплохо бы передавать владение. А не копировать и не пробрасывать ссылку.
- std::move() - взгляд пользователя. Решаем с помощью std::move() конкретные практические задачи.
- rvalue ссылки
- Реализация копирования и перемещения в собственных классах
- Постигаются шаблоны в достаточной степени, чтобы прийти к...
- Perfect forwarding!
Мне этот подход кажется самым жизненным и практико-ориентированным. И последовательным.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Если интересно, то вот как мув-семантику объясняют другие. У каждого свой подход) План трех хороших лекций:
HSE C++ Advanced 2024 Lectures (Move семантика)
- Каждое выражение характеризуется типом и категорией
- Категории: lvalue, xvalue, prvalue, ...
- Примеры категорий с пояснениями: (a, b) = 5;
- lvalue ссылки
- Примеры ссылок
- Константную ссылку можно привязать к rvalue
- Идиома swap+clear (как жили до появления мув-семантики в С++11)
- Чем плох auto_ptr и за что он был выпнут из стандарта: в конструкторе копирования исходный указатель обнуляется. Это неочевидное поведение, ибо все остальные конструкторы копирования не меняют исходный объект.
- Почему такое поведение auto_ptr было необходимо.
- Затрака про rvalue ссылки и мув-семантику
- Самостоятельное изобретение мув-семантики для auto_ptr. Получается рабочий, но страшненький вариант.
- ...А вот если бы обладали властью над синтаксисом языка, мы могли бы сделать красиво.
- Приходим к && и std::move(). На этом месте всем становится ясно, что std::move() ничего не мувает)
- Правило трех -> правило пяти / правило нуля.
- Разбираются примеры объявления rvalue ссылок.
- На семинарах обещается разобрать perfect forwarding, std::forward().
Константин Владимиров. Базовый курс C++ (MIPT, ILab). Lecture 5. RAII и перемещение
- Что такое владение ресурсом
- Примеры освобождения ресурсов: в разных ветках кода, в Си-стиле через goto, goto-маскирующая конструкция do-while(0), linux kernel кодинг стайл: может быть несколько меток для goto
- Чем плох goto. Другие goto-маскирующие конструкции: switch-case, break, continue, return
- Освобождение ресурса в деструкторах: RAII
- Класс ScopedPointer, который освобождает ресурс в деструкторе. Конструктор от сырого указателя. Разбор, чем ScopedPointer плох: при копировании ScopedPointer получается shallow copy. Как написать копирование и присваивание, как не дать утечь указателю? Как сделать доступ к состоянию?
- Глубокое копирование
- Оператор *() - dereference. Оператор ->()
- Чем ScopedPointer опять плох? Получили слишком много выделений памяти при свопе ScopedPointer. Подводка к семантике перемещения: в языке не хватает механизма, чтобы сделать RAII эффективными.
- Что такое lvalue, lvalue ссылки. rvalue
- Семантика перемещения и rvalue ссылки
- Что такое std::move()
- Кросс-связывание: rvalue ссылка не может быть связана с lvalue, неконстантная lvalue ссылка не может быть связана с rvalue, сама по себе rvalue ссылка задает имя и адрес и является lvalue
- Методы на rvalues. Аннотации методов через & и &&
- Проблемы при возвращении rvalue ссылок
- Перемещающие конструкторы и операторы. Выгода при глубоком копировании
- Перемещающее присваивание. Как делать правильно: оставляем правую часть в консистентном (инварианты класса не нарушены), но не обязательно предсказуемом состоянии
- Эффективный обмен значениями. Как swap() был реализован до С++11, как - после
- Как не убивать RVO злоупотреблениями std::move
- Особенности std::move(). Что будет при муве инта. Перемещение по умолчанию перемещает по умолчанию все поля класса
- Правило пяти и правило нуля
Илья Мещерин. Лекторий ФПМИ. C++ 27. move-семантика, move-конструкторы
- Описание проблемы: несколько примеров кода с лишним копированием. Например, vec.emplace_back(3, "some_str")
- std::move - взгляд со стороны пользователя
- используем семантику && в move-конструкторах и перемещающих операторах присваивания. Пока не вдаемся в подробности, что это такое. Просто юзаем.
- В каких случаях какие конструкторы и операторы надо определять, а в каких они создаются компилятором
- std::swap для пользовательского класса с мув-конструктором
- Свой push_back, проблема с emplace_back и обобщением копирующего/перемещающего push_back в своем классе строка
- Правило пяти - если есть нетривиальное что-то из этого, то нужно определить все
- Виды value
- Правила инициализации ссылок
- Универсальные ссылки
- Реализация std::move
- Проблема унификации push_back
- swap и универсальные ссылки
- std::forward
- emplace_back, push_back и std::forward
- std::forward от rvalue
- xvalue
- temporary materialization
- reference qualifiers
cpp/contents.md
Outdated
- ...макросы | ||
|
||
# Сборка проекта | ||
- Организация проекта |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Тут можно поговорить про различные варианты организации проектов, от "плоской", до сложных типа pitchfork: http://www.max-sperling.bplaced.net/?p=10296 или организации библиотек по типу супер проекта (boost, Qt)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Знать, какие удобные варианты раскладки проекта выработало сообщество и самому не ломать над этим голову - это полезно.
Не менее полезно знать modern cmake. И хорошие практики для работы с Conan, vcpkg и т.д. И вообще уметь в "инфраструктуру вокруг языка".
К чему я веду) Материала, касающегося непосредственно C++, очень и очень много. Уже сейчас количество глав подходит к 50. Это опасно: чем более раздутый курс, тем больший процент студентов его забросит. Мы должны уметь вовремя останавливаться.
Какие у нас есть варианты:
- Выносим пункт "Автоматизация сборки" из этой главы в отдельную. И в ней на примере нескольких раскладок проекта (плоская, pitchfork и тд) показываем, что из себя представляет modern cmake.
- В пункт "Организация проекта" добавляем буквально пару фраз про то, что вариантов организации проектов масса, но вот есть такая, такая и такая. Со ссылками на гитхаб, чтобы студент мог на примере живого проекта познакомиться с вариантом организации.
- Для инфраструктурных приседаний вокруг C++ напрашивается отдельный курс. Но у нас нет автора.
Кто что думает?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Не смог удержаться и пройти мимо.
Поддерживаю. Cmake кмк сильнее всех распространен, но это целый отдельный мир и более того, это один из вариантов, увы. Хотелось бы конечно что-то одно, а у нас:
- configure && make/nmake
- cmake
- bazel
- ?
И сами эти системы тянут на отдельный курс.
Имхо, для знакомства с языком эти системы могут быть пропущены, потому что вызвать компилятор для 2-3 единиц трансляции не сложно, а в рамках курса я не думаю что будет полезно делать больше. Например при объяснении линковки или типов либ, объяснить как скомпилить либу и как ее линкануть. Тут не тот масштаб, когда надо браться за систему сборки.
Если по курсу планируется привязка к ОС, то можно минимально подцепить Makefile, ибо это приятный бонус. Годится не только для C++)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Отрефакторено в спираль)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
С нетерпением жду курс, недавно закончил курс по фронтедн. До этого сам изучал С++, дошел до вертуальных функций, нечего не понял, забросил)) но очень хочу начать учить этот непростой язык.
Скопипащу сюда обсуждение про спиральную и слоистую структуру подачи материала. Оно велось в нашей группе. Оно важное и я не хочу, чтобы оно затерялось.
@Reavolt кажется, это ты говорил:
Мне больше по душе 2-х уровневый подход:
В частности на основе 4-ой главы можно сделать небольшую выжимку, в которой рассказать про построение проекта, используя gcc и CMake. А 4-ую главу передвинуть в конец. |
cpp/contents.md
Outdated
- Перегрузка функций | ||
- inline | ||
|
||
# Что такое UB |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Чтобы добить оставшихся, можно ещё пару слов об IF и IFNDR написать.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Да, это вещь. Пришлось добавить)
@umedjankabiri @Nomlsbad @mrmomenticus @Reavolt @khva @leha-bot @Intey Гайз, содержание курса отрефакторено для спиральной подачи материала. Между некоторыми главами добавлены проекты для практики. Гляньте пожалуйста и покритикуйте. |
"Инфраструктура вокруг языка" — я думаю этот блок лучше отложить до конца базового уровня, чтобы не перегружать новичков на старте. Упоминание ссылок и указателей можно отложить до обсуждения "RAII и управления памятью". Стандартные контейнеры и алгоритмы |
# Классы: основы | ||
- Поля и методы | ||
- Спецификаторы доступа protected, public, private | ||
- friend |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
На будущее, возможно пригодится в мотивации, зачем нам нужен это самый friend
.
Мне нравится пример, где может быть удобен friend
- тестирование с помощью gtest
.
В их гайде, есть ответ на вопрос "как тестировать приватную часть класса?". И там они советуют в целевой (тестируемый) класс добавить friend GTestMyTestCaseName
(имя класса генерируется макросом) и вуаля, в тесте можем творить бесчинства.
Тут холеварный момент - "а надо ли тестировать через приватную часть?", но как минимум, можно в тестах упростить проверку на ожидаемое состояние класса.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Да, френдить тестовые классы - классический пример из реальной жизни. У него есть и плюсы, и минусы. Обязательно их перечислим.
Этот пункт главы будет совсем маленьким. Он сводится к перечислению баззвордов с кратким описанием. Это важно, потому что пользователь так или иначе будет что-то дополнительно искать и читать. Его жизнь будет проще, если он к тому моменту ухватит основные баззворды и будет в теме, что такое stl, boost, gtest и т.д.
В задачах часто придется передавать в функцию объекты по константным ссылкам. Чтобы для пользователя это не было черной магией, кажется, про ссылки нужно поговорить пораньше. Полноценная глава про указатели будет сильно дальше. А до нее - просто краткое упоминание.
Можешь пожалуйста предложить конкретный вариант разбиения на главы этого куска курса? Попробовала сделать что-то такое, но получилась дичь из чередования ифов, строк, циклов, векторов и тд. С какой-то стороны это хорошо. Потому что несколько глав подряд учить контейнеры - скучно. Но выглядит такое оглавление как поток сознания. В общем, покажи, как ты это видишь)
На данный момент же так и есть? Сначала массивы, потом списки, мапы и тд. |
- Адресная арифметика | ||
- Массивы | ||
- Управление ресурсами, new/delete vs memalloc/free | ||
- Идиома pimpl |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
оно разве связано с указателями? больше же про компоновку проекта и "что в хедере писать, а что в cpp". Может нужна отдельная глава, про "зачем вообще хедеры и почему без них никак"? Там же можно глубже ковырнуть в ELF (или аналог на винде), про то, как исполняемый находит библиотеки и как это изменить?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
оно разве связано с указателями? больше же про компоновку проекта и "что в хедере писать, а что в cpp"
Эта штука затрагивает две темы. Она о том, чтобы в хедере объявить нужный класс, через forward-declaration объявить внутренний класс, и в нужном классе сделать поле - указатель на объект этого внутреннего класса. Определение которого будет в cpp.
Так как про хедеры и cpp уже есть в главах "Базовые концепции", "Как собрать и запустить простой проект", то к этой главе пользователь будет хорошо подготовлен.
Может нужна отдельная глава, про "зачем вообще хедеры и почему без них никак"?
Это будет в "Базовые концепции", "Как собрать и запустить простой проект". "без них никак" - ну, это уже не совсем так. Появились же модули. И про них кстати тоже будет.
Там же можно глубже ковырнуть в ELF (или аналог на винде), про то, как исполняемый находит библиотеки и как это изменить?
Это уедет в "Подкапотная магия компилятора". Возможно, эта глава будет переименована, потому что в ней будет и про детали сборки.
- noexcept | ||
|
||
# Классы: основы | ||
- Поля и методы |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Не нашёл нигде ничего про указатели на поля и методы классов.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Докинули! a12a3fe
Обсуждаем содержимое курса по C++. Проекты для практики будут добавлены после устаканивания порядка глав.
Каждая глава начинается с небольшого введения и заканчивается резюме - краткой выжимкой главы в формате списка.