🖥 Курс Эффективное использование С++
📚 Лекция 1. Начнем с основ: библиотеки, утилиты, средства разработки и сборка проектов в С++. Присоединяйтесь, чтобы узнать, как максимально эффективно использовать ресурсы вашего проекта!
🔍 Лекция 2. Глубже в тему работы с памятью: избегаем утечек ресурсов с помощью RAII и умных указателей. Узнаем, как управлять памятью без лишних хлопот
➡️ Лекция 3. Переходим к Move semantics, rvalue reference и perfect forwarding. Открываем новые возможности и улучшаем производительность нашего кода
🔄 Лекция 4. Обсудим callbacks: лямбда-выражения, bind и function. Узнаем, как делать наш код более гибким и модульным
🧵 Лекция 5. Многопоточность в C++. Разбираемся с потоками, блокировками, задачами, атомарными операциями и очередями сообщений
💡 Лекция 6. Обзор возможностей современных стандартов C++. Узнаем, какие новшества есть в мире С++ и как они могут улучшить наш код
👉 Ссылка на курс
📚 Лекция 1. Начнем с основ: библиотеки, утилиты, средства разработки и сборка проектов в С++. Присоединяйтесь, чтобы узнать, как максимально эффективно использовать ресурсы вашего проекта!
🔍 Лекция 2. Глубже в тему работы с памятью: избегаем утечек ресурсов с помощью RAII и умных указателей. Узнаем, как управлять памятью без лишних хлопот
➡️ Лекция 3. Переходим к Move semantics, rvalue reference и perfect forwarding. Открываем новые возможности и улучшаем производительность нашего кода
🔄 Лекция 4. Обсудим callbacks: лямбда-выражения, bind и function. Узнаем, как делать наш код более гибким и модульным
🧵 Лекция 5. Многопоточность в C++. Разбираемся с потоками, блокировками, задачами, атомарными операциями и очередями сообщений
💡 Лекция 6. Обзор возможностей современных стандартов C++. Узнаем, какие новшества есть в мире С++ и как они могут улучшить наш код
👉 Ссылка на курс
🔮 Самые частые суффиксы для алгоритмов
• std::*_n — вместо диапазона значений используется количество
• std::*_if — предикат вместо значения
• std::*_copy — результат копируется в новый структуру данных
👉 Ссылка на список алгоритмов
• std::*_n — вместо диапазона значений используется количество
• std::*_if — предикат вместо значения
• std::*_copy — результат копируется в новый структуру данных
👉 Ссылка на список алгоритмов
🔮 assert
assert или утверждение — давно появившийся #define из стандартной библиотеки
Принцип работы
- Если выражение внутри assert ложное, будет terminate программы
- Для release сборке assert превратится в пустышку
Особенности
- В C++11 появился static_assert — применяется для выражений, которые могут быть вычислены в compile time
- assert очень часто используется в gamedev-коде, даже когда удобнее было бы применить try...catch. Это делается по нескольким причинам: assert дешевле (чем try...catch), в release сборке его вообще нет, поэтому можно их писать чуть ли не везде
assert или утверждение — давно появившийся #define из стандартной библиотеки
Принцип работы
- Если выражение внутри assert ложное, будет terminate программы
- Для release сборке assert превратится в пустышку
Особенности
- В C++11 появился static_assert — применяется для выражений, которые могут быть вычислены в compile time
- assert очень часто используется в gamedev-коде, даже когда удобнее было бы применить try...catch. Это делается по нескольким причинам: assert дешевле (чем try...catch), в release сборке его вообще нет, поэтому можно их писать чуть ли не везде
🔍 Что такое empty base optimization?
В C++ любой класс, даже пустой, будет размером не меньше одного байта. Это необходимо, чтобы не было проблем с арифметикой указателей. Однако наследование от пустого класса будет приводить увеличению размера наследника. Но, в C++ предусмотрена empty base optimization, которая позволяет компилятору оптимизировать занимаемую память, так что объект, наследующий пустой базовый класс, не будет занимать дополнительной памяти за счет этого пустого базового класса. Таким образом, размер объекта будет таким же, как если бы он не наследовал пустой класс
В C++ любой класс, даже пустой, будет размером не меньше одного байта. Это необходимо, чтобы не было проблем с арифметикой указателей. Однако наследование от пустого класса будет приводить увеличению размера наследника. Но, в C++ предусмотрена empty base optimization, которая позволяет компилятору оптимизировать занимаемую память, так что объект, наследующий пустой базовый класс, не будет занимать дополнительной памяти за счет этого пустого базового класса. Таким образом, размер объекта будет таким же, как если бы он не наследовал пустой класс
🔮 Сетевое программирование в C++
Для C++ пока, к сожалению, не написали стандартную библиотеку для работы с сетью. Но, зато есть множество хороших библиотек (Boost.Asio, Qt Network и др.). Так же стоит понимать, что многие компании пишут свои библиотеки и поэтому стоит лучше познакомиться с основами сетевого программирования, чтобы легко вникать в любую из реализаций
Что касается Boost.Asio, то для него есть перевод книги Boost.Asio C++ Network Programming
🔗 Ссылочки со спискоми библиотек
• Awesome C++
• C++ Networking libraries
• Stackoverflow (старый пост)
Для C++ пока, к сожалению, не написали стандартную библиотеку для работы с сетью. Но, зато есть множество хороших библиотек (Boost.Asio, Qt Network и др.). Так же стоит понимать, что многие компании пишут свои библиотеки и поэтому стоит лучше познакомиться с основами сетевого программирования, чтобы легко вникать в любую из реализаций
Что касается Boost.Asio, то для него есть перевод книги Boost.Asio C++ Network Programming
🔗 Ссылочки со спискоми библиотек
• Awesome C++
• C++ Networking libraries
• Stackoverflow (старый пост)
🔮 Историческая справка по lambda'м
Вышла обзорная статья по развитию lambda-выражений для разных стандартов языка
👉 Краткий обзор развития лямбда-выражений в C++11, C++14, C++17 и C++20
#junior
Вышла обзорная статья по развитию lambda-выражений для разных стандартов языка
👉 Краткий обзор развития лямбда-выражений в C++11, C++14, C++17 и C++20
#junior
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
🔮 Curiously Recurring Template Pattern
Curiously Recurring Template Pattern (CRTP) или странно рекурсивный шаблон — идиома языка C++, идея которого заключается в том, что некоторый класс X наследуется от шаблона класса, использующего X как шаблонный параметр
🔥 Важно
- Это не паттерн, а техника
- Изначально это выглядело как ошибка компиляции
- Часто используется как альтернатива виртуальным методам
- Его полезно знать, чтобы не возникало ступора при прочтении такого кода
Curiously Recurring Template Pattern (CRTP) или странно рекурсивный шаблон — идиома языка C++, идея которого заключается в том, что некоторый класс X наследуется от шаблона класса, использующего X как шаблонный параметр
🔥 Важно
- Это не паттерн, а техника
- Изначально это выглядело как ошибка компиляции
- Часто используется как альтернатива виртуальным методам
- Его полезно знать, чтобы не возникало ступора при прочтении такого кода
👔 Что такое consteval?
consteval — спецификатор для функций, появился в C++20. Он обозначает, что функция будет вычислена на этапе компиляции. В этом его главное отличие от constexpr, который может быть вычеслен как на этапе компиляции, так и на этапе выполнения программы. consteval не получится вызвать во время выполнения программы, будет ошибка!
consteval — спецификатор для функций, появился в C++20. Он обозначает, что функция будет вычислена на этапе компиляции. В этом его главное отличие от constexpr, который может быть вычеслен как на этапе компиляции, так и на этапе выполнения программы. consteval не получится вызвать во время выполнения программы, будет ошибка!
🔮 Что такое designated initializers?
designated initializers — фитча появишаяся в C++20, которая позволяет явно указывать инициализацию членов структуры или класса по их имени, а не по порядку объявления. Это удобно, когда структура или класс имеет большое количество членов или когда нужно инициализировать только определённые члены
designated initializers — фитча появишаяся в C++20, которая позволяет явно указывать инициализацию членов структуры или класса по их имени, а не по порядку объявления. Это удобно, когда структура или класс имеет большое количество членов или когда нужно инициализировать только определённые члены
⚙️ Классы хранилищ (storage class)
Классы хранилищ — класс определяющий срок службы и область действия своих переменных и функций
В C++ поддерживаются следующие классы хранения: auto, static, register, extern и mutable, thread_local
Однако, ключевое слово register устарело в C++11. В C++17 он был удален и зарезервирован для использования в будущем
Классы хранилищ — класс определяющий срок службы и область действия своих переменных и функций
В C++ поддерживаются следующие классы хранения: auto, static, register, extern и mutable, thread_local
Однако, ключевое слово register устарело в C++11. В C++17 он был удален и зарезервирован для использования в будущем
🔮 Ключевое слово volatile
Ключевое слово volatile сообщает компилятору, что переменная может измениться, и компилятор об этом не узнает. Переменные, объявленные как volatile, не будут кэшироваться компилятором и, следовательно, всегда будут считываться из памяти
Одно из назначений этого ключевого слова — это работать с внешними устройствами, взаимодействие с которыми идёт через память. Проще говоря устройство устройство мапится напрямую в память процесса
Ключевое слово volatile сообщает компилятору, что переменная может измениться, и компилятор об этом не узнает. Переменные, объявленные как volatile, не будут кэшироваться компилятором и, следовательно, всегда будут считываться из памяти
Одно из назначений этого ключевого слова — это работать с внешними устройствами, взаимодействие с которыми идёт через память. Проще говоря устройство устройство мапится напрямую в память процесса
🔮 Ключевые слова final и override
Ключевое слово override заставляет компилятор проверить, что метод virtual и находится в базовом классе. Если не найдёт базовый класс или метод будет иметь другую сигнатуру, то компилятор выдаст ошибку времени компиляции
final — если реализация (дальнейшая) не подразумевается дальнейшего переиспользования (наследования), то final прервёт наследование
Ключевое слово override заставляет компилятор проверить, что метод virtual и находится в базовом классе. Если не найдёт базовый класс или метод будет иметь другую сигнатуру, то компилятор выдаст ошибку времени компиляции
final — если реализация (дальнейшая) не подразумевается дальнейшего переиспользования (наследования), то final прервёт наследование
🔮 Что такое enum class?
• В C++11 на смену стандартному перечислению (enum), пришёл enum class
• Работает также как и просто enum. В качестве предка можно использовать любой целочисленный тип (например int)
• Самое главное отличие от enum, то что enum class и правда является namespace'ом и определения из него не видны снаружи без использования имени самого enum class
• В C++11 на смену стандартному перечислению (enum), пришёл enum class
• Работает также как и просто enum. В качестве предка можно использовать любой целочисленный тип (например int)
• Самое главное отличие от enum, то что enum class и правда является namespace'ом и определения из него не видны снаружи без использования имени самого enum class