📰 Свеженькое из мира C++
Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.
😎 Интересное:
• Как уволиться грамотно: 8 шагов, чтобы закрыть все вопросы — разбираемся как подготовиться к увольнению
• constexpr аллокации в C++20: new при компиляции — разбираемся почему теперь можно аллоцировать память во время компиляции
• Бесплатная база по C++ с тонной практики — бесплатный курс по C++
• 8 признаков, что тебя готовят к увольнению — будь осторожен, эти признаки тебе намекнут на то, что тебе нужно вспоминать свой пароль от HH
📙 Ranges:
• Алгоритмы диапазонов: Алгоритмы поиска
• Алгоритмы диапазонов: Алгоритмы сортировки
🔹📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#свежак
Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.
😎 Интересное:
• Как уволиться грамотно: 8 шагов, чтобы закрыть все вопросы — разбираемся как подготовиться к увольнению
• constexpr аллокации в C++20: new при компиляции — разбираемся почему теперь можно аллоцировать память во время компиляции
• Бесплатная база по C++ с тонной практики — бесплатный курс по C++
• 8 признаков, что тебя готовят к увольнению — будь осторожен, эти признаки тебе намекнут на то, что тебе нужно вспоминать свой пароль от HH
📙 Ranges:
• Алгоритмы диапазонов: Алгоритмы поиска
• Алгоритмы диапазонов: Алгоритмы сортировки
🔹📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#свежак
😁3👍1🥱1
Forwarded from Библиотека задач по C++ | тесты, код, задания
Что вернёт программа?
Anonymous Quiz
11%
Неопределённое поведение
38%
1
10%
Ошибка компиляции
35%
2
7%
Зависит от компилятора
std::shared_ptr хранит рядом с объектом control block — счётчик владельцев. Несколько shared_ptr безопасны, пока делят один control block. Проблема: иногда объекту нужно отдать shared_ptr на себя, но внутри метода есть только сырой this, который о counter'е ничего не знает.❌ Наивный способ:
struct S {
std::shared_ptr<S> self() { return std::shared_ptr<S>(this); }
};
auto p = std::make_shared<S>();
auto q = p->self();У
p и q свои control block'и, у каждого счётчик = 1 → объект удалится дважды (UB).struct S : std::enable_shared_from_this<S> {
std::shared_ptr<S> self() { return shared_from_this(); }
};
auto p = std::make_shared<S>();
auto q = p->self();База добавляет скрытый
weak_ptr<S>. При первом заворачивании в shared_ptr его конструктор замечает эту базу и кладёт туда свой control block. Теперь q разделяет счётчик с p.shared_ptr<S> shared_from_this() { return shared_ptr<S>(weak_this); }Это конструктор из
weak_ptr, а не lock(): без владельца он бросает bad_weak_ptr, а не молча возвращает пустой указатель.S s; // на стеке — никто не владеет
s.shared_from_this(); // 💥 bad_weak_ptr (до C++17 — UB)
struct T : std::enable_shared_from_this<T> {
T() { shared_from_this(); } // 💥 хук срабатывает после конструктора
};
Правила: наследовать публично, владеть через
shared_ptr (лучше make_shared). Нужна проверка без исключения — в C++17 есть weak_from_this():• Наследуйте
enable_shared_from_this публично.• Владейте объектом через
shared_ptr — лучше make_shared (одна аллокация + exception-safety).• Не вызывайте
shared_from_this() в конструкторе и на объектах со стека — будет bad_weak_ptr.• Нужна проверка без исключения — в C++17 берите
weak_from_this():if (auto sp = obj.weak_from_this().lock()) { /* владелец есть */ }📍Навигация: Вакансии • Задачи • Собесы • Канал в Max
Библиотека C/C++ разработчика
#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰4🔥3❤1👍1😁1
Разберём
copy, transform, fill/generate, а также remove, reverse и unique — и заодно увидим, почему «удаление» в C++ удаляет не сразу.🍵 ranges::copy / copy_if — копирование
std::vector<int> src = {1, 2, 3, 4, 5};
std::vector<int> dst(5);
std::ranges::copy(src, dst.begin()); // dst == {1, 2, 3, 4, 5}
// Копирование с условием
std::vector<int> evens;
std::ranges::copy_if(src, std::back_inserter(evens),
[](int x) { return x % 2 == 0; });
// evens == {2, 4}Приёмник — один итератор (куда писать). Под copy буфер должен быть нужного размера; для
copy_if берут std::back_inserter — он сам расширяет контейнер.copy_backward.std::vector<std::string> src = {"alpha", "beta", "gamma"};
std::vector<std::string> dst(3);
// Перемещение вместо копирования
std::ranges::move(src, dst.begin());
// dst == {"alpha", "beta", "gamma"}
// src содержит валидные, но "опустошённые" строки
// Обмен содержимым двух диапазонов
std::vector<int> a = {1, 2, 3};
std::vector<int> b = {4, 5, 6};
std::ranges::swap_ranges(a, b);
// a == {4, 5, 6}, b == {1, 2, 3}move переносит ресурсы, а не копирует — дёшево для строк, векторов и прочих «тяжёлых» типов.std::vector<int> src = {1, 2, 3, 4, 5};
std::vector<int> squared(5);
std::ranges::transform(src, squared.begin(), [](int x){ return x * x; });
// squared == {1, 4, 9, 16, 25}Применяет функцию к каждому элементу и пишет результат в приёмник. Источник не меняется.
std::vector<int> dst(5);
std::ranges::fill(dst, 0); // {0, 0, 0, 0, 0}
std::ranges::generate(dst, [n = 0]() mutable { return n++; });
// {0, 1, 2, 3, 4}
fill кладёт одно и то же значение, generate зовёт функцию на каждый элемент — удобно для счётчиков, случайных чисел или любой генерации «на лету».std::vector<int> data = {1, 2, 3, 2, 4, 2, 5};
// Старый способ:
data.erase(std::remove(data.begin(), data.end(), 2), data.end());
// Новый способ (C++20):
auto [first, last] = std::ranges::remove(data, 2);
data.erase(first, last);
// data == {1, 3, 4, 5}Важный момент:
remove ничего физически не удаляет — он лишь сдвигает «выжившие» элементы в начало и возвращает поддиапазон «мусорного хвоста». Реально обрезает контейнер только последующий erase.std::erase(data, 2): одна строка вместо пары.std::vector<int> data = {1, 3, 4, 5};
std::ranges::reverse(data); // {5, 4, 3, 1}Переворачивает диапазон на месте, без дополнительной памяти.
std::vector<int> dups = {1, 1, 2, 3, 3, 3, 4};
auto [u_first, u_last] = std::ranges::unique(dups);
dups.erase(u_first, u_last);
// dups == {1, 2, 3, 4}Как и
remove, возвращает поддиапазон хвоста и требует erase для реальной очистки. struct Task {
std::string name;
int priority;
};
std::vector<Task> tasks = {
{"Код", 1}, {"Почта", 0}, {"Деплой", 2}, {"Черновик", 0}
};
// Удалить все задачи с priority == 0 — без лямбды
auto [first, last] = std::ranges::remove(tasks, 0, &Task::priority);
tasks.erase(first, last);
// Остались {"Код", 1} и {"Деплой", 2}Проекция — последний аргумент:
remove, copy_if, transform и другие умеют работать «по полю».remove это лишь сравнение на равенство; для условий сложнее (priority > 0) нужен remove_if.📍Навигация: Вакансии • Задачи • Собесы • Канал в Max
Библиотека C/C++ разработчика
#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
⚡️ Продолжаем знакомить вас с экспертами курса AgentOps!
— Сергей Нотевский расскажет, как выстроить FinOps для AI-продуктов: оптимизировать затраты на разработку и продакшен, внедрить model routing, semantic cache и систему алертов для контроля расходов
— Эмиль Сатаев разберет Context Engineering: управление контекстом, защиту от prompt injection, работу с длинными контекстами и построение безопасного пайплайна входа для AI-систем
— Михаил Бондаревский покажет, как подготовить инфраструктуру для AI-агентов: Docker, sandboxing, streaming, docker-compose и воспроизводимое окружение для разработки и продакшена
— Мурат Хажгериев расскажет про Enterprise Integrations & MCP: когда MCP действительно нужен, как подключать внешние сервисы и реализовывать интеграции с OAuth2 delegation
— Герман Сабиров разберет Governance & Compliance для AI-систем: data flow, audit logs, требования 152-ФЗ, локализацию данных и построение compliance-подхода на уровне архитектуры
Курс для backend-разработчиков, тимлидов и LLM инженеров о том, как внедрять AI-логику в бэкенд IT-продуктов и сохранять стабильность сервиса.
👉 Изучить обновленную программу AgentOps и занять место.
— Сергей Нотевский расскажет, как выстроить FinOps для AI-продуктов: оптимизировать затраты на разработку и продакшен, внедрить model routing, semantic cache и систему алертов для контроля расходов
— Эмиль Сатаев разберет Context Engineering: управление контекстом, защиту от prompt injection, работу с длинными контекстами и построение безопасного пайплайна входа для AI-систем
— Михаил Бондаревский покажет, как подготовить инфраструктуру для AI-агентов: Docker, sandboxing, streaming, docker-compose и воспроизводимое окружение для разработки и продакшена
— Мурат Хажгериев расскажет про Enterprise Integrations & MCP: когда MCP действительно нужен, как подключать внешние сервисы и реализовывать интеграции с OAuth2 delegation
— Герман Сабиров разберет Governance & Compliance для AI-систем: data flow, audit logs, требования 152-ФЗ, локализацию данных и построение compliance-подхода на уровне архитектуры
Курс для backend-разработчиков, тимлидов и LLM инженеров о том, как внедрять AI-логику в бэкенд IT-продуктов и сохранять стабильность сервиса.
👉 Изучить обновленную программу AgentOps и занять место.
🖥 86Box 6.0: низкоуровневая эмуляция x86 как она есть
Вышел релиз открытого эмулятора 86Box — эмуляция машин от 8086 до Celeron Mendocino, способная поднять MS-DOS, Windows 3.11/95, OS/2, BeOS и NEXTSTEP.
• Реализована симуляция звуков HDD: писк шпинделя и щелчки позиционирования головок — фетиш для тех, кто скучает по железу 90-х
• Добавлен виртуальный сетевой коммутатор для связи нескольких экземпляров 86Box между собой
• Появился турбо-режим, снимающий искусственное ограничение скорости эмуляции.
• Заметно поднята производительность на ARM-хостах, добавлен запуск под ARM64-версии Windows
• Расширен список эмулируемых машин (от IBM Multistation 5550 до плат на Slot 1) и звуковых карт ISA/LPT
Кодовая база остаётся на чистом C — что для проекта с такой плотностью низкоуровневой работы с железом выбор предсказуемый: прямой контроль над памятью и отсутствие сюрпризов на границе ABI.
👉 Github
📍Навигация: Вакансии • Задачи • Собесы • Канал в Max
Библиотека C/C++ разработчика
#свежак
Вышел релиз открытого эмулятора 86Box — эмуляция машин от 8086 до Celeron Mendocino, способная поднять MS-DOS, Windows 3.11/95, OS/2, BeOS и NEXTSTEP.
• Реализована симуляция звуков HDD: писк шпинделя и щелчки позиционирования головок — фетиш для тех, кто скучает по железу 90-х
• Добавлен виртуальный сетевой коммутатор для связи нескольких экземпляров 86Box между собой
• Появился турбо-режим, снимающий искусственное ограничение скорости эмуляции.
• Заметно поднята производительность на ARM-хостах, добавлен запуск под ARM64-версии Windows
• Расширен список эмулируемых машин (от IBM Multistation 5550 до плат на Slot 1) и звуковых карт ISA/LPT
Кодовая база остаётся на чистом C — что для проекта с такой плотностью низкоуровневой работы с железом выбор предсказуемый: прямой контроль над памятью и отсутствие сюрпризов на границе ABI.
👉 Github
📍Навигация: Вакансии • Задачи • Собесы • Канал в Max
Библиотека C/C++ разработчика
#свежак
👍3
Forwarded from Библиотека собеса по C++ | вопросы с собеседований
Чтобы безопасно использовать выровненные SIMD-загрузки (например, _mm256_load_ps) по SoA-массиву float, массив должен быть выровнен на:
Anonymous Quiz
3%
1 байт
26%
4 байта
28%
8 байт
38%
32 байта
6%
Выравнивание не важно
👾1
📤 export: что именно вы отдаёте наружу?
Из модуля наружу видно только то, что помечено
Открыть наружу можно почти любую сущность: функции, типы, шаблоны, переменные, псевдонимы
🪐 Удобные формы записи
❗️
❌ Ошибки
•
• функцию со
• нельзя открывать что-либо из общей вступительной части модуля (того, что идёт до
📍Навигация: Вакансии • Задачи • Собесы • Канал в Max
Библиотека C/C++ разработчика
#константная_правильность
Из модуля наружу видно только то, что помечено
export. Всё остальное снаружи не видно — но это не «закрытость» уровня файла: у непомеченных сущностей модульное связывание, то есть их видят другие единицы трансляции того же модуля, просто не видит код, который подключает модуль. Это противоположность заголовкам, где в чужой код текстуально попадает вообще всё.export module geometry;
export struct Point { double x, y; }; // открыто наружу
double dist(Point a, Point b); // скрыто снаружи,
// но доступно внутри модуля
export double length(Point p) { // открыто наружу
return dist(p, {0, 0});
}
Открыть наружу можно почти любую сущность: функции, типы, шаблоны, переменные, псевдонимы
using.export { // блок экспорта
int foo();
int bar();
}
export namespace net { // только объявления ЭТОГО блока
void connect();
}
export import utils; // повторный экспорт: проброс
// чужого модуля дальшеexport namespace открывает только то, что объявлено в этом блоке. Если позже снова открыть пространство имён net без export, новые имена наружу не уйдут.• export допустим только в единице, которая начинается с export module …;. В единице реализации (module geometry; без export) это ошибка компиляции•
export нельзя ставить на сущности в безымянном пространстве имён — у них внутреннее связывание• функцию со
static не открыть — она по определению локальна (внутреннее связывание)• нельзя открывать что-либо из общей вступительной части модуля (того, что идёт до
export module …;)📍Навигация: Вакансии • Задачи • Собесы • Канал в Max
Библиотека C/C++ разработчика
#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3❤1👍1🥱1
🐸 Подборка вакансий для C++-разработчиков за неделю
Системный разработчик С++ — Офис (Москва)
Разработчик C++ — Удалёнка
Senior C Developer —Удалёнка
Разработчик на C/C++ под Linux — от 250 000 и до 350 000 ₽ Удалёнка/Гибрид (Москва)
📍Навигация: Вакансии • Задачи • Собесы • Канал в Max
Библиотека C/C++ разработчика
#вакансии
Системный разработчик С++ — Офис (Москва)
Разработчик C++ — Удалёнка
Senior C Developer —Удалёнка
Разработчик на C/C++ под Linux — от 250 000 и до 350 000 ₽ Удалёнка/Гибрид (Москва)
📍Навигация: Вакансии • Задачи • Собесы • Канал в Max
Библиотека C/C++ разработчика
#вакансии
😁1
⚙️ TypeScript без V8: AOT-компиляция в нативный бинарник
В МойОфисе уперлись в санкционные ограничения Qt и медленную разработку UI на C++. Решение — компилировать TypeScript в натив напрямую, без браузера и интерпретатора.
• Фронтенд компилятора написан на самом TS и крутится в Node.js: переиспользуют парсер и AST от Microsoft
• Выход фронтенда — LLVM IR, дальше стандартный бэкенд LLVM и llc. По сути поток компиляции концептуально идентичен Clang
• Свой JS-рантайм (TSNative STD): базовые типы ECMAScript, GC, event loop — всё, что обычно даёт V8
• Сопоставление TS-вызовов с C++-символами идёт через .d.ts-декларации и nm: ищут по обычному имени, вставляют в IR mangled
Точка входа живёт на стороне C++: она инициализирует рантайм и дёргает единственный экспорт tsmain, в который слинкован весь TS-код как статическая библиотека (extern «C», с оглядкой на ABI)
👉 Статья
👉 Видео
📍Навигация: Вакансии • Задачи • Собесы • Канал в Max
Библиотека C/C++ разработчика
#буст
В МойОфисе уперлись в санкционные ограничения Qt и медленную разработку UI на C++. Решение — компилировать TypeScript в натив напрямую, без браузера и интерпретатора.
• Фронтенд компилятора написан на самом TS и крутится в Node.js: переиспользуют парсер и AST от Microsoft
• Выход фронтенда — LLVM IR, дальше стандартный бэкенд LLVM и llc. По сути поток компиляции концептуально идентичен Clang
• Свой JS-рантайм (TSNative STD): базовые типы ECMAScript, GC, event loop — всё, что обычно даёт V8
• Сопоставление TS-вызовов с C++-символами идёт через .d.ts-декларации и nm: ищут по обычному имени, вставляют в IR mangled
Точка входа живёт на стороне C++: она инициализирует рантайм и дёргает единственный экспорт tsmain, в который слинкован весь TS-код как статическая библиотека (extern «C», с оглядкой на ABI)
👉 Статья
👉 Видео
📍Навигация: Вакансии • Задачи • Собесы • Канал в Max
Библиотека C/C++ разработчика
#буст
😢5👍2🤔2
😎 Знакомьтесь с экспертом Proglib.academy: Senior Software Engineer и Team Lead в Yandex Cloud Роман Барлос
Роман — консультант нашего курса «Разработка ИИ-агентов». Он работает на стыке cloud-native архитектуры и AI, активно внедряя современные ИИ-подходы в реальные процессы разработки.
За что его ценит IT-комьюнити?
🟣 Team Lead и AI-евангелист в команде UX Yandex Cloud
🟣 Техлид Sourcecraft Code Assistant
🟣 Создатель полезного Open Source
🟣 Автор интерактивных ML-визуализаций
Роман регулярно делится инженерными наработками, инсайтами и экспертизой в своем авторском Telegram-канале
На курсе Роман выступает консультантом программы: он помогает формировать содержание уроков с опорой на актуальные инженерные практики и жесткие требования индустрии.
Узнать больше о программе и разработке автономных систем:
👉 Курс «Разработка ИИ-агентов»
Так, продолжаем знакомить вас с командой?
👍 — Да, ждем новых лиц
🔥 — Жду полезные материалы от Романа
Роман — консультант нашего курса «Разработка ИИ-агентов». Он работает на стыке cloud-native архитектуры и AI, активно внедряя современные ИИ-подходы в реальные процессы разработки.
За что его ценит IT-комьюнити?
14-лет в разработке. Занимается AI-адопшеном в команде Yandex Cloud, проводит мастер-классы и продвигает лучшие практики для повышения эффективности разработчиков.
С сильным практическим бэкграундом принимал участие как технический лид в создании мощного AI-расширения для VS Code.
Разрабатывает утилиты, которые позволяют быстро начать эксперименты с инференсом и агентами в локальном окружении: например, набор скриптов vllm-setup для быстрого запуска окружения и mini-proxy — минималистичный прокси для OpenAI API провайдеров.
Объясняет сложные концепции наглядно. Создал серию залипательных обучающих материалов, где можно вживую пощупать работу сетей Хопфилда, машин Больцмана и VC-размерности.
Роман регулярно делится инженерными наработками, инсайтами и экспертизой в своем авторском Telegram-канале
На курсе Роман выступает консультантом программы: он помогает формировать содержание уроков с опорой на актуальные инженерные практики и жесткие требования индустрии.
Узнать больше о программе и разработке автономных систем:
👉 Курс «Разработка ИИ-агентов»
Так, продолжаем знакомить вас с командой?
👍 — Да, ждем новых лиц
🔥 — Жду полезные материалы от Романа
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1🥱1
📰 Свеженькое из мира C++
Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.
😎 Интересное:
• Как выдать shared_ptr на себя из метода? — решение проблемы передачи сырых указателей на самого себя
• 86Box 6.0: низкоуровневая эмуляция x86 как она есть — обновление полноценного эмуляторы для x86 платформы
• export: что именно вы отдаёте наружу? — разбираем способы экспорта из C++ модулей
• TypeScript без V8: AOT-компиляция в нативный бинарник — интересный подход по связыванию TypeScript с C++ кодом
📙 Ranges:
• Алгоритмы диапазонов: Алгоритмы модификации
🔹📍Навигация: Вакансии • Задачи • Собесы • Канал в Max
Библиотека C/C++ разработчика
#свежак
Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.
😎 Интересное:
• Как выдать shared_ptr на себя из метода? — решение проблемы передачи сырых указателей на самого себя
• 86Box 6.0: низкоуровневая эмуляция x86 как она есть — обновление полноценного эмуляторы для x86 платформы
• export: что именно вы отдаёте наружу? — разбираем способы экспорта из C++ модулей
• TypeScript без V8: AOT-компиляция в нативный бинарник — интересный подход по связыванию TypeScript с C++ кодом
📙 Ranges:
• Алгоритмы диапазонов: Алгоритмы модификации
🔹📍Навигация: Вакансии • Задачи • Собесы • Канал в Max
Библиотека C/C++ разработчика
#свежак
😁1
Forwarded from Библиотека собеса по C++ | вопросы с собеседований
В C++23 приняли P2718R0 — и старый баг range-for тихо исчез. Но не для всех временных объектов и не безусловно.
std::vector<int> getData() { return {1, 2, 3}; }
for (int x : getData() // временный 1
| filtered) // вью поверх него
std::cout << x;📍Навигация: Вакансии • Задачи • Собесы • Канал в Max
Библиотека C/C++ разработчика
#константная_правильностьx
Please open Telegram to view this post
VIEW IN TELEGRAM