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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
Download Telegram
AI-агенты 2026: системный подход к автономности

Даже в мире C++ нельзя игнорировать ИИ. В новом году мы учимся проектировать высокопроизводительные системы, где логику принятия решений берут на себя агенты.

Что разберём на курсе:

— архитектура ReAct: как разделить логику и действия агента;
— построение сверхбыстрых RAG-систем для работы с документацией;
— протокол MCP: как подружить разные модели в одной системе;
— оркестрация через n8n для автоматизации разработки.

🎁 До 12 января действует акция «3 в 1»: курс по ИИ-агентам + 2 курса в подарок.

Прокачать системный AI
👍3🥰1
🐸 Подборка вакансий для C++-разработчиков за неделю

C Developer (VPP/DPDK) — от 200 000 ₽ Офис/удалёнка (Москва)

Программист С/Linux — от 300 000 ₽ Удалёнка

C/C++ Developer — от 400 000 ₽ Удалёнка

Reverse engineer — от 400 000 ₽ Гибрид (Санкт-Петербург)

C++-разработчик (Linux) — Удалёнка

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

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

#вакансии
👍2
🤔 Теоретический вопрос

Вопрос: У map и set есть методы find() и count(). Оба могут проверить наличие элемента. В чём разница и когда какой метод предпочтительнее использовать с точки зрения производительности?


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

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

#междусобойчик
2😁32
🍪 Почему compare_exchange_weak может "случайно" провалиться?

Многие разработчики думают, что compare_exchange_weak — это просто облегчённая версия compare_exchange_strong. На самом деле у неё есть неочевидное поведение: она может вернуть false, даже если значение совпадает.


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

На некоторых архитектурах (ARM, PowerPC) атомарные операции реализованы через инструкции load-link/store-conditional (LL/SC). Процессор помечает адрес памяти при чтении и проверяет при записи — не изменился ли он.

Но вот проблема: между LL и SC может произойти spurious failure — ложный отказ. Это случается, если:

• Произошло переключение контекста
• Кеш-линия была вытеснена
• Другой процессор обратился к соседней памяти

std::atomic<int> counter{0};
int expected = 0;
// Может вернуть false, даже если counter == 0!
bool success = counter.compare_exchange_weak(expected, 1);


✈️ На x86 такого нет — там используется инструкция CMPXCHG, которая атомарна на уровне железа. Но спецификация C++ допускает spurious failures для переносимости.


💡 Практический вывод:

Всегда используй compare_exchange_weak в цикле. Для однократных попыток бери compare_exchange_strong — она гарантирует, что false означает реальное несовпадение значений.


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

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

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5👍3
"Timestamp — это просто timestamp, какая разница?" — так думают многие, пока не сталкиваются с багами при работе со временем в распределенных системах или при логировании событий.


В C++20 добавили целых 5 новых типов часов, и каждый решает свою специфическую задачу.


❗️ Ключевые моменты статьи:

utc_clock — учитывает leap seconds для точной синхронизации с реальным временем;
tai_clock и gps_clock — работают без leap seconds для научных вычислений и спутниковых систем;
file_clock — обеспечивает предсказуемую работу с файловыми таймстемпами;
local_t — позволяет явно управлять часовыми поясами и DST.

Основной фокус — на различиях между временными шкалами. Особенно актуально для систем логирования, работы с GPS-данными, файловыми системами и любых задач, где критична точность временных меток.


👉 Больше подробностей


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

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

#буст
👍3🔥21
✏️ std::execution — параллелизм одной строкой

Добавление execution policy превращает обычный алгоритм в параллельный (sort, for_each, transform и др.).

🙂 Последовательно (C++98):

std::vector<int> data(1'000'000);
std::sort(data.begin(), data.end());


😃 Параллельно (C++17):

#include <execution>

// Автоматическая векторизация + многопоточность
std::sort(std::execution::par_unseq,
data.begin(), data.end());


❗️Политики:

std::execution::seq        // Последовательно
std::execution::par // Параллельно
std::execution::par_unseq // Параллельно + векторизация
std::execution::unseq // Только векторизация (C++20)


‼️ Замечание: Измеряйте производительность — параллелизм не всегда быстрее!

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

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

#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
👏9😁1👾1
🏭 Трудоголизм — новая база корпоративной культуры в IT 2026

В 2025 году IT-индустрия завершила эксперимент с wellbeing-программами и пришла к циничному выводу: попытка избавить зумеров от выгорания экономически невыгодна. В 2026 карьерный рост линейно зависит от готовности работать сверх сил, а компании внедряют up-or-out: либо показываешь рост, либо уходишь.

👉 Читать статью

🐸 Библиотека мобильного разработчика

#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7😢4👍1
Roadmap: Оркестрация и деплой ИИ-агентов

Для `DevOps`-инженера ИИ-агенты — это новые типы нагрузок, требующие специфического мониторинга, безопасности и масштабирования.

План освоения технологии:

— понимание логики автономных агентов и их взаимодействия с API;

— настройка окружений для работы мультиагентных систем;

— управление состоянием (`State`) и памятью агентов в кластерах;

— безопасность и контроль доступа при Tool Calling.

Курс «Разработка ИИ-агентов» поможет разобраться в архитектуре ИИ-сервисов и научиться внедрять их в продакшн.

Освоить ИИ-инструменты

Акция «3 в 1» до 19 января: купите курс и получите ещё два в подарок.
C++ Roadmap: производительность в мире ИИ-агентов

Понимание архитектуры ИИ-агентов критично для создания быстрых и эффективных систем, работающих с нейросетями на низком уровне.

Ключевой стек навыков:

— архитектура автономных агентов и их циклы принятия решений;

— оптимизация Inference и управления ресурсами при вызове инструментов;

— проектирование логики для агентных систем;

— масштабируемость мультиагентных структур.

Курс «Разработка ИИ-агентов» даст вам понимание того, как устроены современные ИИ-решения изнутри.

Посмотреть программу

Акция «3 в 1»: при покупке курса до 19 января вы получаете ещё два курса в подарок.
🥱5👍2
🍴 Почему co_return не возвращает значение напрямую?

Большинство думают, что корутины — это просто синтаксический сахар. На деле это хирургическая операция над указателем стека.

🍉 При вызове co_await компилятор генерирует код, который:

1. Сохраняет текущий RSP (указатель стека)
2. Копирует локальные переменные в heap-allocated фрейм
3. Переключает RSP на стек другой корутины

‼️ Магия в одной инструкции:

mov rsp, [coroutine_stack_ptr]


Процессор продолжает выполнение, но теперь все push/pop идут в другую область памяти. Регистры RBP, RIP тоже меняются — полная иллюзия «другой функции».

💡 В C++20 stackless корутины делают иначе — вообще не трогают RSP, храня состояние в объекте. Но stackful (Boost.Context) именно так и работают.

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

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

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8💯32
🛠 restrict — keyword, которого нет в C++

Компилятор не может векторизовать, если боится, что указатели пересекаются.

//  Компилятор не знает, пересекаются ли a и b
void add(float* a, float* b, size_t n) {
for (size_t i = 0; i < n; ++i) {
a[i] += b[i]; // Что если a и b — один массив?
}
}

// Подсказываем компилятору (C++20)
void add(float* __restrict a, float* __restrict b, size_t n) {
for (size_t i = 0; i < n; ++i) {
a[i] += b[i]; // Теперь векторизуется!
}
}

// Или используйте std::span (C++20)
void add(std::span<float> a, std::span<float> b) {
std::transform(a.begin(), a.end(), b.begin(), a.begin(),
std::plus<>{}); // Векторизуется автоматически
}


❗️ restrict — это ключевое слово из C99 (стандарта языка C), которое не является частью стандарта C++.

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

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

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤔4
«Этот манёвр будет стоить нам 51 год...»

Разработчики на C++ знают цену производительности. Оптимизируйте свой путь в обучении: забирайте курсы по архитектуре, алгоритмам и математике до того, как они подорожают.

До 19 января в Proglib Academy действуют старые условия:

— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования

Инвестировать в навыки

⚠️ Повышение цен уже 19 января
3😁2
😃 Задача на выходные

#include <iostream>
#include <thread>
#include <chrono>

struct Counter {
long long a;
long long b;
};

void increment(long long& val) {
for (int i = 0; i < 100'000'000; i++) val++;
}

int main() {
Counter cnt{ 0, 0 };
auto start = std::chrono::high_resolution_clock::now();

std::thread t1(increment, std::ref(cnt.a));
std::thread t2(increment, std::ref(cnt.b));
t1.join(); t2.join();

auto end = std::chrono::high_resolution_clock::now();
std::cout << "Time: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms\n";
return 0;
}


Вопрос: Как можно ускорить работу данного кода?


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

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

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1