Библиотека C/C++ разработчика | cpp, boost, qt
19.5K subscribers
1.99K photos
64 videos
16 files
4.26K links
Все самое полезное для плюсовика и сишника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/d6cd2932

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
Download Telegram
Никаких утечек памяти — только чистые знания

В мире C++ ценятся те, кто понимает, как работает железо и математика, а не просто копипастит с StackOverflow. Укрепи фундамент, чтобы писать производительный код.

Акция 1 + 2:

Три курса по цене одного. Оплачиваешь самый дорогой — два других компилируются бесплатно.

Выбор плюсовиков:

— алгоритмы и структуры данных (обязательно);
— математика для Data Science (если интересен highload AI).

Получить доступ
Актуально до 31 декабря.

Сегментация выбора? Поможем: @manager_proglib
1😁1
⚙️ Структурированное логирование: JSON vs plain text?

Текстовые логи хороши для человека, но кошмарны для автоматизированного анализа. Пришло время переходить на структурированное логирование.

Структурированные логи в формате JSON или другом машиночитаемом формате позволяют легко фильтровать, агрегировать и анализировать данные. Вместо парсинга строк регулярками вы получаете готовые поля: timestamp, level, message, context, trace_id.

В C++ это достигается через библиотеки типа spdlog с кастомными formatters или специализированные решения вроде Boost.Log. Ключевой момент — добавление контекста: user_id, request_id, session_id. Это превращает хаотичный поток логов в структурированные данные, с которыми может работать ELK stack, Grafana Loki или другие системы мониторинга.

😏 Используете ли вы структурированное логирование или всё ещё разбираете plain text?

🔹Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹Сайт Proglib

Библиотека C/C++ разработчика

#междусобойчик
👍31😁1
🔧 std::promise — move-only тип. И это правильно!

Попытка скопировать promise не скомпилируется. Почему? Потому что обещание должно быть выполнено ровно один раз, одним владельцем.

//  НЕ СКОМПИЛИРУЕТСЯ
std::promise<int> prom1;
std::promise<int> prom2 = prom1; // Error!

// Move семантика — владение передаётся
std::promise<int> prom1;
std::promise<int> prom2 = std::move(prom1);

// Типичное использование в потоке
std::thread t([p = std::move(prom)]() mutable {
p.set_value(42); // Только этот поток владеет promise
});


Аналогия: Представьте promise как расписку о долге. Копия расписки — это две расписки? Или передача прав требования? Очевидно, второе.

При передаче в std::thread или lambda используйте:
• std::move для r-value
• mutable lambda если будете вызывать set_value

⚡️ Move-only семантика — это фитча, а не bug. Она предотвращает race conditions и двойные set_value.

Библиотека C/C++ разработчика

#константная_правильность
👍7🙏1
🤖 5 профессий в IT, которые появились благодаря ИИ

Искусственный интеллект не только автоматизирует рутинные задачи, но и создает новые профессии, о которых еще несколько лет назад никто не слышал. Какие именно — рассказываем в этой статье.

👉 Статья

Библиотека C/C++ разработчика

#свежак
👍2
Библиотека C/C++ разработчика

#развлекалово
🥱7😁5🤔2😢1
😎 std::generator в C++23: как упростить код сопрограмм в 5 раз

В C++20 появились корутины, но даже простой генератор требовал 20-100 строк boilerplate-кода. C++23 решает эту проблему с помощью std::generator — стандартного интерфейса, который превращает генерацию последовательностей в одну строку.

📹 Доклад Нико Джосуттиса на Meeting C++ 2025

Автор книг по C++ и участник стандартизации показывает, как std::generator работает под капотом. Разбирается механизм приостановки/возобновления, управление состоянием в heap и обработка исключений. Идеально для тех, кто хочет понять корутины на практике, а не только в теории.

🎯 Практическая ценность

Увидите реальные примеры: от простой итерации по массиву до реализации бесконечной последовательности Фибоначчи. Докладчик сравнивает классический подход с итераторами и современный с std::generator.

Для разработчиков, которые готовы перейти на C++23 и хотят писать более элегантный код.

👉 Доклад


📍 Навигация: ВакансииЗадачиСобесы

Библиотека C/C++ разработчика

#линкер_рекомендует
6👍4
😎 Топ-вакансий для C++ разработчиков за неделю

Backend-разработчик

Разработчик C++

Разработчик С++ (Middle)

✍️ Еще больше топовых вакансий — в нашем канале C++ jobs

📍Навигация: ВакансииЗадачиСобесы

Библиотека C/C++ разработчика

#буст
👍1
🐸 Подборка вакансий для C++-разработчиков за неделю

C++ Developer (General Components / Sensors) — от 350 000 ₽ Офис/Гибрид (Москва)

C++ Developer (Real-Time Audio Processing) — от 288 000 и до 320 000 gross

Backend-разработчик — от 200 000 ₽ Удалёнка

C++ Team Lead (3D Картa) — от 250 000 ₽ Удалёнка

C++ Developer (Middle/Senior) — от 2 000 и до 4 000$ Удалёнка

Senior C++ Software Engineer (SaaS) — от 4 000 $ Удалёнка

Библиотека C/C++ разработчика
👍2
Вопрос: Можно ли получить stacktrace в constexpr контексте?

Ответ: Нет! std::stacktrace::current() (C++23) не является constexpr функцией, так как stacktrace это runtime. Компилятор не имеет «call stack» во время компиляции в том же смысле.
👍51
🎓 Твой опыт стоит дорого — стань экспертом Proglib Academy

Чувствуешь, что накопил достаточно знаний, чтобы делиться ими с другими?

Мы ищем сильных практиков, которые хотят попробовать себя в роли:

— преподавателей;
— авторов курсов;
— наставников.

Это возможность не только монетизировать экспертизу, но и прокачать личный бренд, структурировать собственные знания и вырастить новое поколение специалистов.

👉 Заполни короткую анкету
😁3
📰 Свеженькое из мира C++

Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.

😎 Интересное:

Рализация своего ECS движка — разбор реализации hand-made ECS движка
std::promise — move-only тип — описание проблемы с копированием std::promise
5 профессий в IT, которые появились благодаря ИИ — статья о том как ИИ создаёт профессии
std::generator в C++23: как упростить код сопрограмм — доклад об использовании стандартного интерфейса, который превращает генерацию последовательностей в одну строку

📍Навигация: ВакансииЗадачиСобесы

Библиотека C/C++ разработчика

#свежак
👍1
👀 Почему std::async может заблокировать ваш поток?

Многие думают, что std::async всегда создаёт новый поток. На самом деле это не так.

По умолчанию std::async использует политику запуска std::launch::async | std::launch::deferred. Это означает, что реализация сама решает, выполнить задачу асинхронно или отложить до вызова get().

auto future = std::async(heavy_task);
// Может НЕ запуститься прямо сейчас!
auto result = future.get(); // Тут может начать выполняться


🍴 Под капотом: При std::launch::deferred задача сохраняется как callable объект и выполняется синхронно при первом обращении к future. Никакого нового потока.

✏️ Что происходит в памяти: Создаётся shared state, хранящий либо результат, либо исключение. Deferred-задача живёт в виде объекта функции до момента вызова.

🧋Вывод: Если вам нужна гарантия параллельности, явно указывайте std::launch::async. Иначе рискуете получить синхронное выполнение там, где ожидали асинхронное.

auto future = std::async(std::launch::async, heavy_task);


📍Навигация: ВакансииЗадачиСобесы

Библиотека C/C++ разработчика

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
Что под капотом у агентов?

Вы привыкли работать с памятью и потоками напрямую. AI-агенты — это новый уровень абстракции, но проблемы там те же: оптимизация, задержки, стоимость вычислений.

В новой версии курса «Разработка AI-агентов» мы добавили факультатив "Научный взгляд" и углубились в техническую часть.

Для тех, кто любит хардкор:

Optimization: RAG, векторный поиск, работа с контекстом.
System Design: Мультиагентные системы (AutoGen, LangGraph) как распределенные системы.
Infrastructure: Работа на реальном GPU-кластере (предоставляем доступ).

Это знания, актуальные для 2026 года, когда AI будет встроен в каждое устройство.

⚡️ Акция 3 в 1:

Берешь курс по агентам — получаешь два любых других бесплатно (например, Алгоритмы или Математику, чтобы понимать ML-базу).

Upgrade your skills
😁2
🔥 Почему throw не просто делает goto к catch-блоку?

Возможно ты думал, что исключение — это прыжок в код обработчика. На самом деле между throw и catch происходит сложный процесс деструкции объектов.


Stack Unwinding — это механизм раскрутки стека, который компилятор генерирует автоматически. Когда летит исключение, среда выполнения проходит назад по стеку вызовов и вызывает деструкторы всех локальных объектов в обратном порядке их создания.

Компилятор создаёт специальные таблицы (exception tables в формате DWARF или SEH), которые содержат информацию о том, где какие объекты живут и какие деструкторы нужно вызвать. При броске исключения runtime читает эти таблицы и пошагово очищает стек.

void func() {
Resource r1; // деструктор будет вызван
Resource r2; // и этот тоже
throw Error();
}


Если во время раскрутки деструктор сам бросит исключение, вызывается std::terminate(). Поэтому правило: деструкторы должны быть noexcept.

❗️Stack unwinding гарантирует безопасность ресурсов, но имеет накладные расходы: даже если исключение не бросается, таблицы занимают место в бинарнике. В embedded-системах часто отключают исключения именно поэтому.

📍Навигация: ВакансииЗадачиСобесы

Библиотека C/C++ разработчика

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🥱21
🤟 Путь к мечте продолжается

Два года российские нейрохирурги отказывали мне в операции, запугивая
последствиями. В итоге поехал в Казахстан — сделали две паллидотомии,
которые «нельзя было делать». Речь на месте, здоровье улучшается.
Параллельно учу C++ и ищу работу. История о том, как не сдаваться, когда
система говорит «нет».

👉 Продолжение...

📍Навигация: ВакансииЗадачиСобесы

Библиотека C/C++ разработчика

#буст
7👍4🙏3
⚡️ От SFINAE к Concepts: эволюция метапрограммирования

Compile-time магия прошла долгий путь от криптографического SFINAE к читаемым concepts.

Эра 1: Классический SFINAE (C++98)

template<typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type
increment(T value) {
return value + 1;
}
// Что происходит? Кто знает...


Эра 2: Type traits (C++11/14)

template<typename T>
std::enable_if_t<std::is_integral_v<T>, T>
increment(T value) {
return value + 1;
}
// Чуть лучше с _t и _v суффиксами


Эра 3: if constexpr (C++17)

template<typename T>
T process(T value) {
if constexpr (std::is_integral_v<T>) {
return value + 1;
} else if constexpr (std::is_floating_point_v<T>) {
return value * 1.1;
} else {
return value;
}
}
// Читается как обычный код!


Эра 4: Concepts (C++20)

template<std::integral T>
T increment(T value) {
return value + 1;
}

// Или
auto increment(std::integral auto value) {
return value + 1;
}
// Красота и понятность!


😏 А какой подход вам больше нравится? Напиши в комментариях!

📍Навигация: ВакансииЗадачиСобесы

Библиотека C/C++ разработчика

#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥102👍1😁1
Перевод: Правительство США рассекретило PoC (Proof of Concept)

📍Навигация: ВакансииЗадачиСобесы

Библиотека C/C++ разработчика

#развлекалово
😁103
This media is not supported in your browser
VIEW IN TELEGRAM
AI-агенты: когда точность архитектуры важнее магии промптов

Мы смотрим на ИИ как на инженерную задачу. Мы учим строить автономные системы с детерминированной логикой, контролем ресурсов и предсказуемым поведением.

Основные темы:

управление состояниями в LangGraph для проектирования надёжных стейт-машин;
работа с данными через RAG-системы на базе векторных хранилищ;
автоматизация и мониторинг через связку n8n и LangSmith для полного аудита;
безопасность системы с внедрением Guardrails для защиты от некорректных запросов.

Постройте масштабируемую AI-систему с инженерным подходом.

Записаться на курс
😁32
🐥 Почему std::chrono::duration не хранит единицы измерения?

duration<int, std::milli> не хранит информацию о миллисекундах. На самом деле это compile-time магия.

Как это работает:

duration — это просто обёртка над числом. Шаблонный параметр std::milli (он же std::ratio<1, 1000>) существует только на этапе компиляции.

duration<int64_t, std::milli> ms(1000);
// В памяти: просто int64_t со значением 1000
// Информации "это миллисекунды" в рантайме НЕТ


🍴 Механизм конверсии:

Когда вы пишете duration_cast<seconds>(ms), компилятор вычисляет 1000 / 1000 = 1 на этапе компиляции через механизм std::ratio. Никаких делений в рантайме при конверсии целых периодов.
Вывод: Zero-overhead абстракция. В release-сборке duration<int, milli> — это буквально int с type safety. Но осторожно: duration_cast может обрезать дробную часть при конверсии вниз.


📍Навигация: ВакансииЗадачиСобесы

Библиотека C/C++ разработчика

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9