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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17

#WXSSA
Download Telegram
📰 Свеженькое из мира C++

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

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

Современный C++ для встраиваемых систем — подробный разбор того, как использовать современный C++ в embedded-системах
std::mem_fn vs лямбда — удобная альтернатива лямбдам для оборачивания методов
C++23 и дальше — альтернатива исключениям для обработки ошибок в функциональном стиле
Почему опытным PM, PO и руководителям тоже нужен менторинг — разбор, нужно ли дальнейшее развитие если ты уже PM
Closure size и SBO: когда лямбда уходит в куч — ответ почему лямбда может оказаться в куче
std::span — обёртка над массивами в C++26 стала ещё удобнее и появилось много полезных особенностей
Почему локальные переменные «бесплатны» — описание почему локальные дешевле выделения памяти в куче

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

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

#свежак
3😁2🥰1
Какой механизм C++23 позволяет избежать лишних копирований при передаче объектов в функцию, не нарушая семантику значений?
Anonymous Quiz
22%
Явное перемещение через std::move
15%
Передача через const lvalue-ссылку
28%
Универсальная ссылка через T&&
17%
Deducing this
18%
Copy elision через NRVO
🌚9👍1😁1😢1👾1
🦴 Сколько стоит LOG_DEBUG()?

Автор статьи провёл benchmark четырёх популярных C++ библиотек логирования и выяснил, сколько на самом деле стоит один вызов LOG_INFO().

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

• разница в производительности между библиотеками достигает почти двух порядков
• даже отключённый лог имеет ненулевой overhead — библиотека всё равно проверяет уровень и готовит аргументы
• выбор API форматирования бьёт по скорости: iostream в 4–5 раз медленнее C-style printf


Основной фокус — null-benchmark: измерение стоимости самого вызова логирования, когда вывод отключён. Именно здесь разрыв между библиотеками оказывается максимальным.

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


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

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

#свежак
😁1
🩹 promise_type::operator new — кастомная аллокация фрейма

Корутина выделяет фрейм через ::operator new. Но этот вызов можно перехватить и направить в любой аллокатор — арену, пул, стек. Механизм называется coroutine allocator customization.


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

Когда компилятор генерирует код запуска корутины, он ищет operator new в двух местах по порядку: сначала в типе promise_type — если есть, использует его; затем глобальный ::operator new.

struct MyPromise {
static void* operator new(std::size_t size) {
return my_pool.allocate(size);
}
static void operator delete(void* ptr, std::size_t size) {
my_pool.deallocate(ptr, size);
}
};



⚡️ Параметры аргументов корутины

Стандарт позволяет передать аргументы самой корутины в operator new. Компилятор сначала пробует сигнатуру с аргументами:

static void* operator new(std::size_t sz, Allocator& alloc, auto&&...) {
return alloc.allocate(sz);
}


Это мощно: можно пробросить аллокатор как первый параметр корутины и использовать его для фрейма — без глобального состояния.


‼️ Heap Elision и operator new

Если компилятор применяет heap elision и вообще убирает аллокацию — ваш кастомный operator new не вызовется. Это нормально. Но если вы используете operator new для отладки размеров, убедитесь что оптимизация отключена (-O0 или [[clang::noinline]] на корутину).


Применение

Кастомный аллокатор в корутинах даёт: lock-free аллокацию, аллокацию с арены (без освобождения по одному), размещение на стеке вызывающего. Последнее — буквально O(1) без heap, если время жизни гарантировано.


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

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

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
6❤‍🔥3👍2😁1😢1
👑 IntelliJ IDEA: продвинутый дебаг

Представь, что есть цикл на 10 000 элементов, и баг воспроизводится только на одном конкретном объекте. Без Conditional Breakpoints придется жать F8 вручную сотни раз. А с ними дебаггер сам остановится в нужный момент.

🔹 Как включить


Кликни правой кнопкой на кружок брейкпоинта → появится поле Condition. Введите любое булево Java-выражение. Всё, дебаггер будет останавливаться только когда оно true.

🔹 Примеры из реальной жизни

▪️ Фильтрация по ID
user.getId() == 42

Останавливаемся только на конкретном пользователе — удобно при обработке списка сущностей из БД.

▪️ Фильтрация по содержимому строки
request.getUrl().contains("/admin")

Отлавливаем только определённые HTTP-запросы в фильтре или интерцепторе.

▪️ Ловим NPE до того, как он случился
order.getItems() == null

Останавливаемся именно тогда, когда данные уже сломаны, а не после падения.

▪️ Условие по индексу в цикле
i == 999

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

🔹 Продвинутые трюки

— Log message вместо остановки. Если не хотите прерывать выполнение, а просто логировать — в том же окне брейкпоинта включите "Evaluate and log" и введите выражение.

— Pass count. Чуть ниже в настройках брейкпоинта есть поле "Pass count" — брейкпоинт сработает только на N-м попадании.

— Disable until hit. Можно настроить цепочку: один брейкпоинт активирует другой. В настройках есть "Disable until breakpoint is hit" — указываете другой брейкпоинт, и текущий начнёт работать только после срабатывания того.

⚠️ Condition вычисляется на каждом попадании в брейкпоинт — это вызов на стороне JVM. В горячих местах (tight loop, высоконагруженный метод) это может заметно тормозить приложение.

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

🐸 Библиотека джависта

#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
💡 sentinel_t — зачем ranges придумали конец диапазона как отдельный тип

В классических итераторах begin и end — один тип. В ranges конец диапазона может быть совершенно другим типом. Это ломает интуицию, но открывает возможности.


🔍 Проблема однотипных итераторов

std::string::iterator для begin и end — одно и то же. Чтобы проверить конец, нужно держать два объекта одного размера и сравнивать их. Для C-строк это расточительно: \0 в памяти уже есть, но стандартный end — это полноценный указатель.


⚡️ Sentinel как концепт

В ranges введён концепт sentinel_for<S, I>: тип S является sentinel для итератора I, если их можно сравнивать оператором ==, даже если S != I.

// Sentinel для null-terminated строки
struct null_sentinel {
bool operator==(const char* p) const { return *p == '\0'; }
};

// Теперь можно:
auto r = subrange(ptr, null_sentinel{});


💡 unreachable_sentinel

Специальный std::unreachable_sentinel_t всегда возвращает false при сравнении — это сигнал компилятору, что конец никогда не достигается в данной ветке. Используется в take_view и counted_iterator, чтобы избежать лишних проверок в горячих циклах.

auto v = std::views::counted(ptr, n); 
// end() имеет тип unreachable_sentinel_t
// компилятор оптимизирует проверку конца


⚠️ Именно из-за разнотипных sentinel std::ranges::distance работает за O(n) для forward-итераторов — он вынужден идти до sentinel, не зная расстояния заранее.

Sentinel — это обобщение понятия «конец», а не просто переименование end().


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

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

#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👾1
😎 Топ-вакансий для C++ разработчиков за неделю

Senior Embedded Software Engineer — от 350 000 ₽ Удалёнка

Middle+/Senior C++ Developer —от 2500 и до 3500 $ Удалёнка

C/C++ developer — от 200000 ₽ Удалёнка/гибрид (Москва)

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

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

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

#буст
😁2
🚀 Вышел Qt 6.11

23 марта Qt Company выпустила Qt 6.11 — промежуточный релиз стабильной ветки Qt 6. Полгода публичной поддержки + ещё полгода для коммерческих пользователей.

🦴 Главное в релизе:

🎨 Qt Canvas Painter — новый модуль для аппаратно ускоренной 2D-отрисовки через RHI (OpenGL, Vulkan, Metal, Direct3D). В тестах обгоняет QPainter+OpenGL: в 2× на ноутбуке, в 5× на бюджетном Android-планшете, в 10× на флагманском Samsung Galaxy Tab S8
🌐 Qt WebEngine — поддержка расширений Chromium
🔊 PipeWire — встроенный аудиобэкенд
🎮 Qt Quick 3D — добавлены SSGI и SSR (реалистичное освещение и отражения в реальном времени), улучшено сглаживание движущихся объектов
📊 Qt Graphs — новый тип CustomSeries для произвольных графиков, поддержка нескольких осей в 3D-графиках, пример Wind Turbine Dashboard
⚡️ Qt TaskTree (экспериментальный) — декларативный подход к асинхронным задачам на C++.
🔗 Qt OpenAPI — генерация HTTP-клиентского кода из YAML-спецификации OpenAPI
📱 Android 16 + поддержка Google Play Feature Delivery для разбивки приложений на пакеты
🖼 SVG/Lottie — поддержка морфинг-анимации, масок и символов SVG, стабилизация Qt Quick VectorImage

✏️ Подробнее


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

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

#свежак
🔥6👍21🙏1
😱 Если ваш продукт не умеет отдавать данные в формате, понятном AI-агенту, то вас просто не существует

Скрипт не будет кликать по красивым кнопкам в браузере, он уйдёт к конкуренту с нормальным API. Перестроить архитектуру под машинных клиентов — это уже не хайп, а необходимое условие сохранения конкурентоспособности.

Как адаптировать продукт и не исчезнуть из выдачи:

— интегрировать MCP и A2A-взаимодействие, чтобы агенты могли вас читать;
— научиться контролировать стоимость (лимиты, кэш, роутинг между моделями);
— настроить AgentOps: трейсинг, логирование и отлов регрессий.

Всё это ждёт вас на обновлённом курсе «Разработка AI-агентов». Мы специально сделали фокус на утилитарном инжиниринге и production-ready решениях.

Кстати, до 29 марта можно забрать курс с большой скидкой, и стоит поторопиться — мест на потоке всё меньше.

Зафиксировать цену и начать деплоить агентов без слива бюджета 👈
🥱6😁5🔥1
⚡️ Бесплатный генератор CMakeLists.txt

QuickCoderHub выкатил бесплатный браузерный генератор CMakeLists.txt для C++ проектов — никакой установки, работает полностью в браузере.


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

• визуальная настройка и автогенерация CMakeLists.txt прямо в браузере
• нулевые зависимости — не нужно ничего устанавливать на машину
• мгновенный результат без ручного написания конфигурационных файлов

Основной фокус — убрать рутину настройки системы сборки и дать разработчику готовый CMakeLists.txt под его проект за секунды.

Удобно при старте нового проекта, на собеседованиях, или когда нужно быстро поднять сборку без погружения в документацию CMake.

🍪 Генератор

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

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13💯1
🧩 Выходной челлендж: дочисти парсер команд

У тебя есть заготовка интерактивной оболочки — read-eval-print loop. Осталось дописать несколько ключевых частей.

#include <iostream>
#include <sstream>
#include <vector>
#include <string>

std::vector<std::string> parseCommand(const std::string& line) {
// TODO: разбить строку на токены по пробелам
// Учти: несколько пробелов подряд — не ошибка
}

void execute(const std::vector<std::string>& tokens) {
if (tokens.empty()) return;

if (tokens[0] == "echo") {
// TODO: вывести все аргументы через пробел
} else if (tokens[0] == "exit") {
exit(0);
} else {
// TODO: вывести "Unknown command: <имя команды>"
}
}

int main() {
std::string line;
while (true) {
std::cout << "> ";
if (!std::getline(std::cin, line)) break;
execute(parseCommand(line));
}
}


Задача: заполни три TODO.

💬 Покажи своё решение — особенно интересны варианты с std::istringstream и ручным разбором.


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

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

#междусобойчик
😁31
📰 Свеженькое из мира C++

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

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

Сколько стоит LOG_DEBUG()? — разбор на бэнчмарках сколько реально стоит отладка с помошью логов
promise_type::operator new — удобное управление аллокациями корутин
IntelliJ IDEA: продвинутый дебаг — удобный дебаг в IDE от JetBrains
sentinel_t — зачем ranges придумали конец диапазона как отдельный тип
Вышел Qt 6.11 — добавили много полезного функционала
Генератор от QuickCoderHub — бесплатный генератор CMakeLists.txt с удобным UI

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

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

#свежак
👍1
👾 GDB: отладка без боли

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

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

• как backtrace за секунды показывает точное место падения и стек вызовов
• пошаговое выполнение кода с next/step и просмотр значений переменных прямо в рантайме
• TUI-режим — визуальный интерфейс GDB, про который почти нет статей на русском

Основной фокус — практика: реальный пример с Segmentation fault, который cout не помог бы поймать, а GDB раскрывает за 15 секунд через bt и print.

Статья написана для тех, кто только начинает или до сих пор избегает отладчика. Никакой магии — 80% задач решается 5–10 командами, которые разбираются по одной.

👉 Статья

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

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

#линкер_рекомендует
👍7
🧩 std::rotate_copy — зачем нужна копия, если есть rotate?

std::rotate_copy существует не для удобства — он закрывает конкретный случай, когда мутация исходника недопустима, но выделять промежуточный буфер вручную неудобно.

std::vector<int> src = {1, 2, 3, 4, 5};
std::vector<int> dst(src.size());

std::rotate_copy(src.begin(), src.begin() + 2, src.end(), dst.begin());
// src: {1, 2, 3, 4, 5} — не тронут
// dst: {3, 4, 5, 1, 2}


🔍 Под капотом:

rotate_copy — это ровно два вызова std::copy:

auto out = std::copy(middle, last, result);   // [middle, last) первыми
std::copy(first, middle, out); // [first, middle) следом


Никакой магии. Никаких swap. Просто два последовательных копирования.

Сложность: O(n) с одним проходом данных, без дополнительной памяти (кроме выходного диапазона).

💡 Когда это важно:

// Параллельная обработка: исходник читается несколькими потоками
std::rotate_copy(src.begin(), pivot, src.end(),
std::back_inserter(result));


⚠️ Диапазоны [first, last) и [result, ...) не должны перекрываться — иначе поведение не определено. В отличие от std::rotate, который работает in-place и перекрытий нет по определению.

❗️rotate_copy — частный случай общего принципа STL: алгоритмы с суффиксом _copy не мутируют исходник и пишут в отдельный output iterator.

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

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

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