Лаконичный макрос defer для C++17
Ручное управление ресурсами в низкоуровневом си-подобном коде на C++ — довольно хлопотное занятие. Создание достойных RAII-врапперов для каждого используемого сишного API не всегда практично, а использование подходов с goto cleanup или множеством вложенных if (success) вредит читаемости кода.
Макрос defer как никогда кстати! Отложенная лямбда будет выполнена при выходе из области видимости, независимо от того, будет ли выполнен return, брошено исключение, или даже выполнен goto наружу. Данный макрос по-настоящему zero-cost и не зависит от рантайма C или стандартной библиотеки, поэтому его можно использовать даже в разработке под ядро ОС.
https://habr.com/ru/articles/916732/
#cpp #programming
👉 @cpp_lib
Ручное управление ресурсами в низкоуровневом си-подобном коде на C++ — довольно хлопотное занятие. Создание достойных RAII-врапперов для каждого используемого сишного API не всегда практично, а использование подходов с goto cleanup или множеством вложенных if (success) вредит читаемости кода.
Макрос defer как никогда кстати! Отложенная лямбда будет выполнена при выходе из области видимости, независимо от того, будет ли выполнен return, брошено исключение, или даже выполнен goto наружу. Данный макрос по-настоящему zero-cost и не зависит от рантайма C или стандартной библиотеки, поэтому его можно использовать даже в разработке под ядро ОС.
https://habr.com/ru/articles/916732/
#cpp #programming
👉 @cpp_lib
❤5👍2🔥2
Удобный способ работы с перечислениями в C++ — приведение
Во многих проектах используется
C++ сам по себе не умеет конвертировать
Такой подход хорошо работает, если
#cpp #programming
👉 @cpp_lib
enum
к строке и обратно.Во многих проектах используется
enum
, чтобы задать ограниченный набор значений. Но как вывести значение enum
в лог? Или, наоборот, прочитать из строки и получить нужное значение enum
?C++ сам по себе не умеет конвертировать
enum
в строку и обратно. Вот простая реализация этого функционала через std::unordered_map
:
enum class LogLevel {
Debug,
Info,
Warning,
Error
};
const std::unordered_map<LogLevel, std::string> LogLevelToString = {
{LogLevel::Debug, "Debug"},
{LogLevel::Info, "Info"},
{LogLevel::Warning, "Warning"},
{LogLevel::Error, "Error"},
};
const std::unordered_map<std::string, LogLevel> StringToLogLevel = {
{"Debug", LogLevel::Debug},
{"Info", LogLevel::Info},
{"Warning", LogLevel::Warning},
{"Error", LogLevel::Error},
};
std::string to_string(LogLevel level) {
return LogLevelToString.at(level);
}
LogLevel to_log_level(const std::string& str) {
return StringToLogLevel.at(str);
}
Такой подход хорошо работает, если
enum
не слишком большой. Если значений много — можно автоматизировать генерацию через макросы или использовать библиотеки вроде magic_enum
.#cpp #programming
👉 @cpp_lib
👍7❤3
RAII 2.0: RAII как архитектурный инструмент в C++
Идиома RAII — давно зарекомендовал себя как удобный способ автоматического управления ресурсами в C++. Обычно мы применяем его для управления памятью, файловыми дескрипторами или мьютексами. Однако что, если расширить понятие RAII до управления не только физическими ресурсами, но и логическими контрактами и состояниями системы?
В этой статье я хочу поговорить о том, как RAII можно использовать для контроля жизненного цикла асинхронных операций, транзакций или подписок, гарантируя их корректное завершение или откат до прежнего состояния.
https://habr.com/ru/articles/901092/
#cpp #programming
👉 @cpp_lib
Идиома RAII — давно зарекомендовал себя как удобный способ автоматического управления ресурсами в C++. Обычно мы применяем его для управления памятью, файловыми дескрипторами или мьютексами. Однако что, если расширить понятие RAII до управления не только физическими ресурсами, но и логическими контрактами и состояниями системы?
В этой статье я хочу поговорить о том, как RAII можно использовать для контроля жизненного цикла асинхронных операций, транзакций или подписок, гарантируя их корректное завершение или откат до прежнего состояния.
https://habr.com/ru/articles/901092/
#cpp #programming
👉 @cpp_lib
👍5❤3🤔2
FastCGo: как мы ускорили вызов C-кода в Go в 16,5 раза
Всем привет! Меня зовут Владимир Пустовалов, я C++ разработчик в команде Deckhouse компании «Флант». Мои коллеги — DevOps-инженеры — на данный момент обслуживают более 600 кластеров, и, естественно, в каждом из них развёрнута система мониторинга.
Изначально мы использовали Prometheus — опенсорсную систему мониторинга, написанную на Go. По нашей статистике, она занимала около 20 % ресурсов каждого кластера. Мы не могли с этим мириться и поэтому разработали проект под названием Prom++, в котором многократно сократили потребление оперативной памяти и снизили нагрузку на центральный процессор.
Кратко о том, что мы сделали: переписали на С++ ядро хранения и обработки горячих данных, при этом вся оркестрация и периферия остались в Prometheus на Go, что позволило сохранить полную совместимость с Prometheus. Для частых вызовов кода C++ мы использовали механизм CGo, однако первые тесты показали, что производительность CPU практически не улучшилась из-за медлительности CGo. В итоге мы переписали CGo, создав собственный механизм вызова.
Что будет в этой статье:
Разберём, что такое CGo и почему он медленный.
Создадим простой собственный механизм CGo-вызова.
Доведём этот механизм до полноценного решения.
https://habr.com/ru/companies/flant/articles/923912/
#cpp #programming
👉 @cpp_lib
Всем привет! Меня зовут Владимир Пустовалов, я C++ разработчик в команде Deckhouse компании «Флант». Мои коллеги — DevOps-инженеры — на данный момент обслуживают более 600 кластеров, и, естественно, в каждом из них развёрнута система мониторинга.
Изначально мы использовали Prometheus — опенсорсную систему мониторинга, написанную на Go. По нашей статистике, она занимала около 20 % ресурсов каждого кластера. Мы не могли с этим мириться и поэтому разработали проект под названием Prom++, в котором многократно сократили потребление оперативной памяти и снизили нагрузку на центральный процессор.
Кратко о том, что мы сделали: переписали на С++ ядро хранения и обработки горячих данных, при этом вся оркестрация и периферия остались в Prometheus на Go, что позволило сохранить полную совместимость с Prometheus. Для частых вызовов кода C++ мы использовали механизм CGo, однако первые тесты показали, что производительность CPU практически не улучшилась из-за медлительности CGo. В итоге мы переписали CGo, создав собственный механизм вызова.
Что будет в этой статье:
Разберём, что такое CGo и почему он медленный.
Создадим простой собственный механизм CGo-вызова.
Доведём этот механизм до полноценного решения.
https://habr.com/ru/companies/flant/articles/923912/
#cpp #programming
👉 @cpp_lib
❤4👍1
Trip report: June 2025 ISO C++ standards meeting (Sofia, Bulgaria)
Сегодня — поворотный момент в истории C++: всего несколько минут назад комитет по стандартизации C++ проголосовал за включение первых семи документов по отражению во время компиляции (compile-time reflection) в черновик стандарта C++26 — под продолжительные аплодисменты в зале. Думаю, лучше всего значение этой функции выразила Хана «Мисс Констэкспр» Дусикова несколько дней назад, в своей привычной спокойной и невозмутимой манере... когда ей сказали, что документ по reflection попадёт на голосование в субботу, она слегка пожала плечами и тихо сказала: «Совершенно новый язык».
https://herbsutter.com/2025/06/21/trip-report-june-2025-iso-c-standards-meeting-sofia-bulgaria/
статья от 2025-06-21
#cpp #programming
👉 @cpp_lib
Сегодня — поворотный момент в истории C++: всего несколько минут назад комитет по стандартизации C++ проголосовал за включение первых семи документов по отражению во время компиляции (compile-time reflection) в черновик стандарта C++26 — под продолжительные аплодисменты в зале. Думаю, лучше всего значение этой функции выразила Хана «Мисс Констэкспр» Дусикова несколько дней назад, в своей привычной спокойной и невозмутимой манере... когда ей сказали, что документ по reflection попадёт на голосование в субботу, она слегка пожала плечами и тихо сказала: «Совершенно новый язык».
https://herbsutter.com/2025/06/21/trip-report-june-2025-iso-c-standards-meeting-sofia-bulgaria/
статья от 2025-06-21
#cpp #programming
👉 @cpp_lib
👍9❤3
Media is too big
VIEW IN TELEGRAM
Запись System Level MeetUp. Поток C++
Мы встретились, чтобы поговорить об C++ в системной разработке: обсудить стандарты, подходы и реальные задачи, которые решаются на этом языке.
00:00 - Открытие мероприятия.
08:30 - Доклад "Девиртуализация в C++, компиляторах и вашей программе" (Константин Владимиров и Илья Андреев).
47:50 - Вопросы от участников.
01:00:32 - Доклад "Кодек для json'ов с фиксированной схемой" (Никита Пешаков).
01:27:33 - Вопросы от участников.
01:43:04 - Дискуссия "Как писать меньше на C++?" (Константин Владимиров, Илья Казаков, Алексей Щербаков, Василий Рамаданов).
02:43:06 - Доклад "Реализация динамического полиморфизма для свободных функций" (Кирилл Колодяжный).
03:00:56 - Вопросы участников.
03:11:00 - Доклад "Шаблонное мета-программирование в современном C++ для задач космической баллистики" (Леонид Меркин).
03:59:32 - Вопросы участников.
04:06:05 - Доклад "C++ внутри PostgreSQL: удобство против традиций" (Илья Шишков).
04:46:55 - Вопросы участников.
источник
#cpp #programming
👉 @cpp_lib
Мы встретились, чтобы поговорить об C++ в системной разработке: обсудить стандарты, подходы и реальные задачи, которые решаются на этом языке.
00:00 - Открытие мероприятия.
08:30 - Доклад "Девиртуализация в C++, компиляторах и вашей программе" (Константин Владимиров и Илья Андреев).
47:50 - Вопросы от участников.
01:00:32 - Доклад "Кодек для json'ов с фиксированной схемой" (Никита Пешаков).
01:27:33 - Вопросы от участников.
01:43:04 - Дискуссия "Как писать меньше на C++?" (Константин Владимиров, Илья Казаков, Алексей Щербаков, Василий Рамаданов).
02:43:06 - Доклад "Реализация динамического полиморфизма для свободных функций" (Кирилл Колодяжный).
03:00:56 - Вопросы участников.
03:11:00 - Доклад "Шаблонное мета-программирование в современном C++ для задач космической баллистики" (Леонид Меркин).
03:59:32 - Вопросы участников.
04:06:05 - Доклад "C++ внутри PostgreSQL: удобство против традиций" (Илья Шишков).
04:46:55 - Вопросы участников.
источник
#cpp #programming
👉 @cpp_lib
❤11👍3
Почему C++ считает мой класс копируемым, если его нельзя скопировать?
Рассмотрим следующий сценарий:
Почему выполняется это assertion? Очевидно, что скопировать Derived<int> нельзя, ведь при этом мы попытаемся скопировать некопируемый Base<int>. И в самом деле, если попробовать скопировать его, то мы получим ошибку:
Итак, компилятор считает, что Derived<int> копируемый, но когда мы пытаемся его скопировать, выясняется, что это не так!
https://habr.com/ru/articles/920202/
#cpp #programming
👉 @cpp_lib
Рассмотрим следующий сценарий:
template<typename T>
struct Base
{
// Есть конструктор по умолчанию
Base() = default;
// Не копируемый
Base(Base const &) = delete;
};
template<typename T>
struct Derived : Base<T>
{
Derived() = default;
Derived(Derived const& d) : Base<T>(d) {}
};
// Это assertion выполняется?
static_assert(
std::is_copy_constructible_v<Derived<int>>);
Почему выполняется это assertion? Очевидно, что скопировать Derived<int> нельзя, ведь при этом мы попытаемся скопировать некопируемый Base<int>. И в самом деле, если попробовать скопировать его, то мы получим ошибку:
void example(Derived<int>& d)
{
Derived<int> d2(d);
// msvc: error C2280: 'Base<T>::Base(const Base<T> &)':
// attempting to reference a deleted function
// gcc: error: use of deleted function 'Base<T>::Base(const Base<T>&)
// [with T = int]'
// clang: error: call to deleted constructor of 'Base<int>'
}
Итак, компилятор считает, что Derived<int> копируемый, но когда мы пытаемся его скопировать, выясняется, что это не так!
https://habr.com/ru/articles/920202/
#cpp #programming
👉 @cpp_lib
👍2🔥2
Media is too big
VIEW IN TELEGRAM
17 июля в 19:00 (Мск) приглашаем на онлайн-встречу,посвященную профессиональному развитию в сфере разработки электронных устройств.
Наша Академия программирования электронных устройств занимается повышением квалификации инженеров-радиоэлектронщиков.
На встрече обсудим:
- Кто занимается разработкой электронных устройств сегодня
- Самые востребованные направления в отрасли
- Актуальные возможности для профессионального старта
- Разные форматы работы в этой сфере
Также у вас будет возможность:
- Получить ответы на свои вопросы от эксперта
- Познакомиться с программами дополнительного профессионального образования в этой сфере
Регистрируйтесь прямо сейчас – количество мест ограничено!
После регистрации Вам придет бонус - "Принципы работы радиоэлектронщиков"
Ждем Вас!
Наша Академия программирования электронных устройств занимается повышением квалификации инженеров-радиоэлектронщиков.
На встрече обсудим:
- Кто занимается разработкой электронных устройств сегодня
- Самые востребованные направления в отрасли
- Актуальные возможности для профессионального старта
- Разные форматы работы в этой сфере
Также у вас будет возможность:
- Получить ответы на свои вопросы от эксперта
- Познакомиться с программами дополнительного профессионального образования в этой сфере
Регистрируйтесь прямо сейчас – количество мест ограничено!
После регистрации Вам придет бонус - "Принципы работы радиоэлектронщиков"
Ждем Вас!
👍4🔥2❤1
Курс по ООП в С++
введение
инкапсуляция
наследование
полиморфизм
шаблоны и метапрограммирование
источник
#cpp #programming
👉 @cpp_lib
введение
инкапсуляция
наследование
полиморфизм
шаблоны и метапрограммирование
источник
#cpp #programming
👉 @cpp_lib
👍9
🦀 Хотите стать Middle Rust-разработчиком?
Присоединяйтесь к открытому уроку «Техническое собеседование на Middle Rust разработчика» 24 июля в 20:00 МСК. В режиме онлайн разберем:
— Типичные вопросы, которые вам зададут на собеседовании.
— Задачи, которые дают кандидатам на уровне Middle.
— Частые ошибки на собеседованиях и способы их избежать.
❗️Этот урок — отличная подготовка к карьерному росту в разработке.
👉 Записаться на вебинар курса «Rust Developer. Professional» → https://vk.cc/cNKKqz
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Присоединяйтесь к открытому уроку «Техническое собеседование на Middle Rust разработчика» 24 июля в 20:00 МСК. В режиме онлайн разберем:
— Типичные вопросы, которые вам зададут на собеседовании.
— Задачи, которые дают кандидатам на уровне Middle.
— Частые ошибки на собеседованиях и способы их избежать.
❗️Этот урок — отличная подготовка к карьерному росту в разработке.
👉 Записаться на вебинар курса «Rust Developer. Professional» → https://vk.cc/cNKKqz
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍1
Эффективное использование С++
Лекция 1. Библиотеки, утилиты, средства разработки, сборка (Эффективное использование С++)
Лекция 2. Работа с памятью. Утечки ресурсов. RAII, умные указатели (Эффективное использование С++)
Лекция 3. Move semantics, rvalue reference, perfect forwarding.
Лекция 4. Callbacks: lambda, bind & function.
Лекция 5. Multithreading in C++ (потоки, блокировки, задачи, атомарные операции, очереди сообщений)
Лекция 6. Обзор возможностей современных стандартов C++
источник
#cpp #programming
👉 @cpp_lib
Лекция 1. Библиотеки, утилиты, средства разработки, сборка (Эффективное использование С++)
Лекция 2. Работа с памятью. Утечки ресурсов. RAII, умные указатели (Эффективное использование С++)
Лекция 3. Move semantics, rvalue reference, perfect forwarding.
Лекция 4. Callbacks: lambda, bind & function.
Лекция 5. Multithreading in C++ (потоки, блокировки, задачи, атомарные операции, очереди сообщений)
Лекция 6. Обзор возможностей современных стандартов C++
источник
#cpp #programming
👉 @cpp_lib
👍8❤6