Обновить
128K+

C++ *

Типизированный язык программирования

271,31
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Чёрная магия C++: Быстрый кольцевой буфер

Уровень сложностиСредний
Время на прочтение19 мин
Охват и читатели7.1K

Однажды у меня возникла потребность в кольцевом буфере на C++ для хранения довольно объёмных потоковых данных. Проблема заключалась в том, что мне было необходимо поддерживать непрерывность и упорядоченность данных в памяти, чтобы в любой момент времени я мог считать все элементы буфера одним бесшовным куском в порядке поступления элементов.

Как правило, кольцевой буфер реализуется через списки, вроде std::list или std::deque, либо через плоские массивы, вроде std::vector или boost::circular_buffer. Но ни одна реализация не гарантирует непрерывность и упорядоченность одновременно. В данной статье я расскажу про реализацию буфера через трюк с виртуальной памятью, сохраняющую упорядоченность элементов в непрерывной ограниченной области памяти.

Читать далее

Новости

От железа к собственным VST инструментам

Время на прочтение6 мин
Охват и читатели5.7K

От Железа к собственным VST плагинам

Я музыкант без навыков программирования. Продал свой железный сетап, не нашёл плагинов для живой игры и начал делать их сам с Claude Code. Рассказываю, как появились собственные синтезаторы и графовый движок и почему главным в работе с ИИ оказались правила, а не промпты.

Создаю плагины, не умея программировать

C++ в 2026-м: память, прод, игры, Rust и ИИ — зачем учить язык, который невозможно знать целиком

Уровень сложностиСредний
Время на прочтение45 мин
Охват и читатели7.5K

C++ умеет ровно то, за что его одновременно любят и боятся: дает разработчику почти полный контроль над происходящим, позволяет выжимать из программы максимум производительности, но при этом оставляет возможность столкнуться с ошибкой, которая проявится только через несколько часов или даже дней работы. На C++ строят высоконагруженные системы, движки, embedded-решения и инфраструктуру, хотя рядом уже много лет развиваются Go, Rust и другие языки, которые обещают сделать разработку проще и безопаснее.

Так зачем учить C++ в 2026 году? Насколько важно программисту разбираться в памяти и устройстве процессора? Почему сильных C++-разработчиков по-прежнему мало, хотя язык преподают в университетах? Где без C++ действительно сложно обойтись, а где бизнесу выгоднее выбрать Go и при необходимости добавить серверов? Сможет ли Rust потеснить C++, как нейросети меняют работу программиста и почему современному разработчику уже недостаточно просто знать синтаксис?

Я, Александр, автор телеграм-канала «Shulepov Code», поговорил с Александром Малковым — C++-разработчиком, бывшим сотрудником Яндекса и CTO компании «Вертикаль». Александр также ведет свой телеграм-канал «Thread of Thoughts | Поток мыслей», где делится материалами и наблюдениями из профессиональной практики.  

Разговор получился не только про сам C++, но и про то, что сегодня требуется от сильного разработчика. Мы обсудили userver и падения продакшена, высокие нагрузки и работу с памятью, HFT и геймдев, компиляторы и санитайзеры, работу с legacy-кодом, а также влияние ИИ на профессию. Поговорили о нейросетях в роли своеобразного «джуна на ревью», выгорании в Big Tech и о том, в каких задачах глубокое понимание устройства системы по-прежнему важнее знания конкретного языка.

Читать далее

Боты, которые сами встают в очередь: как я добавил компаньонов в AzerothCore и что сломалось по дороге

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели5.3K

С 2022 года я в одиночку поддерживаю сервер World of Warcraft 3.3.5a на открытом ядре AzerothCore. Расскажу, как я закрывал главную проблему небольшого сервера ботами-компаньонами и на какие грабли при этом наступил. Если вы работаете с AzerothCore или TrinityCore, часть историй может сэкономить вам пару вечеров.

Задача: пустые очереди

Поиск подземелий (LFG) в WotLK рассчитан на тысячи игроков онлайн. На небольшом сервере очередь на героик может висеть часами: нет танка, нет хила, а то и вообще никого. Игрок заходит вечером, ждёт и уходит.

Решение напрашивалось само: если людей не хватает, группу должны добирать боты. Причём такие, которые умеют играть свою роль, а не стоят столбом у входа.

Основа: mod-playerbots

Писать всё с нуля я не стал. Для AzerothCore есть модуль mod-playerbots. Он заводит ботов на отдельных аккаунтах, сам их прокачивает и экипирует. Боты умеют вести себя в подземельях, рейдах и на полях боя.

Я работаю с собственным форком. Главные изменения — поведение ботов в очереди подземелий и на арене, ребаланс и перевод фраз ботов на русский. Сервер русскоязычный, и английские реплики в чате группы смотрелись чужеродно.

Как настраивается пул ботов

Модуль держит пул «случайных ботов». В конфиге задаются минимальная и максимальная численность пула и распределение по уровневым диапазонам: сколько ботов держать на 15–19 уровнях, сколько на 20–29 и так далее до 80-го.

Первая неочевидная вещь: сумма квот по диапазонам должна совпадать с максимальной численностью пула. Если изменить количество ботов и не пересчитать диапазоны, распределение по уровням поедет. Я поймал это, когда сокращал пул с 1550 ботов до 50.

Читать далее

От RTSP-камеры до истории событий: настраиваем видеоаналитику через JavaScript Viewer

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели5.5K

Привет, Хабр! В первой статье я разбирал внутреннее устройство real-time-конвейера на C++20: почему медленный YOLO не должен останавливать RTSP и зачем между этапами нужны ограниченные слоты последнего значения. Теперь посмотрим на ту же систему с другой стороны — глазами пользователя, который подключает камеру и должен получить не просто видео с рамками, а управляемый и проверяемый результат.

Я покажу практический порядок настройки своей платформы видеоаналитики через браузерный JavaScript Viewer: от стабильного потока и детектора движения до постоянных ID, двух контуров YOLO и истории событий в PostgreSQL. Главный вопрос статьи — не «где находится кнопка», а «какой участок конвейера меняет этот параметр и как проверить эффект».

Читать далее

Рутокен с биометрией — не миф

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели5.5K

Будущее наступило, старик 👴🏻🧢🛹✌️ 

В этой статье мы покажем, что биометрию уже пора внедрять; расскажем, почему это просто и относительно дёшево, а также поделимся техническими деталями для разработчиков.

Будет интересно менеджерам, которым не хватает традиционных 2FA, и разработчикам, которым предстоит с этим работать.

P.S. При написании данной статьи не использовались генеративные модели! 100% ручной труд разработчика Георгия. Я просто люблю смайлики 😇

Читать далее

Как не утопить RTSP в YOLO: real‑time‑конвейер на C++20, Clang и ONNX Runtime

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели4.9K

YOLO обрабатывает кадр дольше, чем камера формирует следующий. Если построить видеосервер как последовательность read → motion → YOLO → encode, тяжёлая модель остановит чтение RTSP, очередь начнёт расти, а пользователь увидит прошлое вместо прямого эфира.

В статье разбираю real‑time‑конвейер своего C++20-сервера: постоянные workers, слоты последнего значения, std::jthread, stop_token, защита от устаревших результатов и итоги 16-часового теста на реальной RTSP‑камере.

Читать далее

У нас есть «плюсы» дома: о чем говорили на митапе YADRO × C++ Russia

Время на прочтение2 мин
Охват и читатели8K

С++20-корутины, миграция акторной системы и KvadraOS — все это было на митапе для разработчиков на «плюсах», который организовали YADRO и C++ Russia. Под катом собрали записи докладов и рассказали о новых проектах для инженеров: экскурсии по инженерному центру и проекту о работе с легаси-кодом.

Читать далее

God of Pixels: шесть лет, два языка и один генератор планет

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели8.3K

Личный проект длиной в шесть лет: от школьных скриптов на Python до OpenGL‑рендера с облачностью, климатом и картами звёздных систем. Когда переписывал рендеринг вручную — уходили недели. Когда подключил LLM — два вечера. Рассказываю, как это было, и что при этом чувствуешь.

Читать далее

Разработка CAN адаптера (часть 1)

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели691

Если при слове CAN вы представляете автомобиль и поток данных между его блоками, а слово терминатор, ассоциируется в первую очередь с резистором на 120 Ом, то возможно Вам будет интересно почитать как я дополнил существующий зоопарк CAN адаптеров своим собственным зверем с мобильным приложением для диагностики и логирования.

Читать далее

C++: Айсберг времени жизни объектов

Уровень сложностиСложный
Время на прочтение47 мин
Охват и читатели7.6K

Вам нужна эта статья, если вам не хватает знаний, чтобы ответить на эти вопросы:

• Чем отличается new expression от operator new
• Что такое placement new, какой у него синтаксис, и выделяет ли он память
• В каких случаях и зачем нам может понадобиться вызывать деструктор вручную
• Когда использовать std::launder
• Почему какие-то типы можно копировать через memcpy, и ими можно сразу пользоваться, а для других это будет UB?
• Что вы реально можете кастить через reinterpret_cast
• Почему стандарт C++ такой запутанный и бесчеловечный

Занырнуть

Как собирать кроссплатформенные приложения. На C++. В браузере

Уровень сложностиСредний
Время на прочтение21 мин
Охват и читатели8.5K

TLDR; Нельзя просто так взять и запихнуть реальную систему сборки в браузер. Но если обойти некоторые тонкие технические и юридические моменты - вполне можно, что мы показываем наглядно. Статья о том, как это сделано, и немного о том, где можно применить.

Идея запихнуть clang в браузер и собирать приложения не нова: это уже делали в Emscripten как минимум, и ещё пара исследовательских проектов. Проблема в том, как это использовать в практических сценариях: программирование это не про работающий компилятор, это про целую кучу прикладных библиотек, про инфраструктуру

Проблема встаёт в момент, когда человек узнаёт, сколько в реальности нужно собрать, чтобы получить готовый sysroot для, например, QT: объём работы для подготовки сборочной площадки убивает всю выгоду от идеи. Но что если этой работы делать просто… не нужно.

P.S. Да, это Doom в браузере. Опять. А ещё там есть HoMM2. Ссылка на playground в конце статьи, там, в браузере, можно его запустить, и собрать на свой десктоп. И посмотреть другие примеры.

Как мы докатились до этого

Особенности разработки встраиваемого программного обеспечения. Часть 1

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели7.8K

В этой статье пойдет речь о немаловажных особенностях разработки встраиваемого программного обеспечения (далее ВПО) для микроконтроллеров (далее МК) с низким уровнем абстракции аппаратного обеспечения.

Это не полноценный гайд по написанию кода ВПО, которых на просторах интернета сегодня тьма, а лишь нюансы, которые помогут писать хороший код.

Особенности этой огромной отрасли, embedded-разработки, лежат на поверхности и вытекают из ответа на вопрос: а какая вообще стоит задача? Если обобщить, то прозвучит это так: закодировать алгоритм работы, как правило, многозадачной однопоточной системы с низким уровнем абстракции аппаратного обеспечения.

Читать далее

Ближайшие события

Спустя 5 лет я снова пишу Всеросс — часть 2

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели4.8K

Привет, Хабр! На связи финалист ICPC и гроссмейстер Codeforces MachineSolution. Также напомню, что я продолжаю рассказывать о своей подготовке и соревнованиях в Telegram-канале Machine Solution. Иногда я также беру учеников на индивидуальные занятия. Если вам понравились мои статьи и хочется прокачаться в спортивном программировании — пишите мне, обсудим.

Это вторая часть истории о том, как спустя пять лет после своего школьного Всеросса я решил написать зеркало заключительного этапа ВсОШ по информатике 2026 года. Первую часть можно прочитать здесь. Там я подробнее рассказал о формате олимпиады, стратегии набора баллов и о том, как прошёл мой первый день.

Читать далее

C++: пишем свою std::function

Уровень сложностиСредний
Время на прочтение29 мин
Охват и читатели11K

В этой статье я хочу погрузиться (и погрузить читателя) в дебри C++ на примере написания собственной std::function.

Почему std::function? Потому что реализацияstd::function, внезапно, затрагивает большое количество продвинутых техник и нюансов языка, и все они достаточно любопытны для пытливого плюсовика.

Читать далее

Попасть нельзя промахнуться

Время на прочтение13 мин
Охват и читатели19K

В прошлой статье мы уже немного врали игроку самым наглым образом, когда брали вполне корректную с точки зрения физики проверку земли, растягивали её на несколько миллисекунд и разрешали персонажу прыгнуть уже после того, как он фактически покинул платформу. Всё это делали не из‑за криворукости нашего программиста физики, который не умеет написать нормальную проверку столкновений, а чтобы игрок вообще не знал, что там у нас происходит со столкновениями… да он и не обязан об этом знать.

В сетевой игрe происходит примерно то же самое, но приходится немножечко врать уже не о положении персонажа, а о времени и если coyote time был маленькой ложью о том, где заканчивается платформа, то lag compensation, будет маленькой ложью о том, когда именно существовал игровой мир.

Здесь тоже все интересно и сервер действительно может быть прав что игрок не попал, а игрок всё равно будет уверен, что игра украла у него попадание, не будем разочаровывать игроков и терять прибыль из‑за плохих отзывов.

Читать далее

range-for перестал ронять программу на временном объекте, зато теперь дольше держит мьютекс

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели7.7K

range-based for в C++ выглядит безопасным местом, пока в него не попадает временный объект с внутренней ссылкой. Такой код может годами работать в продакшене, а затем начать читать освобождённую память после смены компилятора или настроек сборки. В статье разбирается, как C++23 изменил время жизни временных объектов в таких циклах, почему поддержка стандарта зависит от компилятора и какие проверки помогут найти проблемные места в кодовой базе.

Узнать детали

BLDC и магнитный энкодер — рецепт получения позиционного привода из FPV-моторчика

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели7.8K

Эксперимент: а можно ли собрать достаточно точный привод из старого FPV-мотора, чтобы в дальнейшем использовать при создании, к примеру, робота-манипулятора или подвеса камеры.

Читать далее

Обработка цифрового звука фильтрами

Уровень сложностиСредний
Время на прочтение25 мин
Охват и читатели9.4K

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

Читать далее

Lock‑free по нарастающей

Уровень сложностиСложный
Время на прочтение16 мин
Охват и читатели12K

Большинство учебников предложит синхронизировать потоки с помощью мьютекса. Но под реальной high-performance нагрузкой блокировки превращаются в кошмар планировщика ОС: несвоевременное вытеснение потока после захвата критической секции способно парализовать ваш пайплайн обработки данных, провоцируя многочисленные переключения контекста, уходы в спячку и сбрасывания кэшей процессора.

В качестве панацеи предлагают lock-free структуры, но и тут полно ловушек — банальный регулярный вызов ядра SetEvent способен сжечь весь выигрыш от lock-free. Сами алгоритмы lock-free порой тяжеловесны, не всегда предлагают удачный trade-off и даже не всегда уместны. Но что ещё хуже: будучи применёнными без должной тщательности, они могут не только не дать выигрыша, но даже навредить.

В этой статье мы разберём устройство нескольких базовых объектов библиотеки wxl и познакомимся с концепцией «алгоритм дешевеет под нагрузкой». Мы пройдём путь от трёх базовых инструкций процессора до готового канала, разберём, как продление release-последовательности спасает от ABA, как ленивые триггеры arm/disarm позволяют будить поток только тогда, когда он реально спит, и как заставить данные летать между ядрами без обращений к операционной системе.

Готовы? Приступаем...
1
23 ...