Обновить
256K+

C++ *

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

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

Асинхронное логирование в C++ — не серебряная пуля: что на самом деле ограничивает производительность

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

Асинхронное логирование давно считается “очевидной оптимизацией”: вынесли запись в отдельный поток — и всё стало быстрее.

Но если копнуть глубже, оказывается, что это не совсем так.

В предыдущей статье я разбирал производительность популярных C++ логгеров и показывал реальные цифры:
👉 https://habr.com/ru/articles/1012874/

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

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

Читать далее

Как найти UB, которое никто не хочет замечать: разбираем clang-tidy изнутри

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

Привет, Хабр! Меня зовут Анастасия Черникова, я занимаюсь разработкой компиляторных технологий и инструментов на базе LLVM в Синтакоре.

Неопределенное поведение (undefined behavior, UB) по-разному выглядит с точки зрения компилятора и разработчика. Для первого оно, как правило, открывает дополнительные возможности для оптимизации. Для программиста же UB может стать проблемой, особенно если оно остается незамеченным и не учитывается при разработке.

В этой статье рассмотрим подход к поиску UB с использованием статического анализа. В качестве примера я использую clang-tidy: сначала разберу, как устроены существующие чекеры и как работают AST matchers, а затем покажу, как расширять их и добавлять собственные проверки, если стандартных возможностей оказывается недостаточно.

Отправиться на поиски UB

Гонка вооружений. Почему античиты всегда проигрывают?

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

ДИСКЛЕЙМЕР:

Автор не призывает к игре с сторонним ПО. Вся информация, приведенная в статье - приведена лишь в образовательных и ознакомительных целях. Информация была взята из открытых источников и ни к чему не призывает.

СОДЕРЖАНИЕ:

Читать далее

MCP vs Thin MCP: где AI агенты теряют скорость

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

MCP выглядит как удобный способ структурировать LLM-приложение, но за это приходится платить. При этом попытки «ускорить систему» через C++, IPC или смену сериализации не всегда дают ожидаемый результат. В статье разбираю, где на самом деле возникает latency и почему архитектура оказывается важнее, чем выбор технологий.

Читать далее

Множество Мандельброта — видео

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

Анимация: генерирует последовательность из 255 высокоточных кадров в формате BMP (frame_000.bmp ... frame_254.bmp) и автоматически компилирует их в видеоролик (файл Mandelbrot.mp4) с частотой 30 кадров в секунду, используя встроенный FFmpeg.

Скачать последнюю версию (Windows и Linux)
В windows это Mandelbrot_windows.exe и ffmpeg.exe
https://github.com/Divetoxx/Mandelbrot-Video/releases
Выше README содержит English и Русский!

FFmpeg - "швейцарский армейский нож" для обработки видео. В 2026 году он остается отраслевым стандартом, поддерживаемым сообществом разработчиков открытого программного обеспечения. От YouTube и Netflix до профессиональных киностудий - все на него полагаются. И да, он совершенно бесплатный.

Читать далее

Concepts в C++: шаблоны, которые наконец‑то понятны

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

Ошибки шаблонов в C++ — отдельный жанр: вы ожидаете простой контракт к типу, а получаете десятки строк из глубин STL. Проблема не в компиляторе, а в том, что сами требования к типам в классических шаблонах долгое время оставались неявными. Concepts это меняют: они позволяют формализовать ожидания к типу прямо в коде, сделать перегрузку осмысленной, а ошибки — читаемыми. В этой статье разберём, как работают concepts, зачем они действительно нужны и как использовать их не как «синтаксический сахар», а как инструмент проектирования.

Читать далее

Как я учу C, делая ASCII игру

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

Я решил учить C не по учебникам, а через практику — сделать свою простую консольную игру. Не ради “проекта мечты”, а чтобы на собственных ошибках разобраться, как всё работает на самом деле.

Читать далее

Возврат значений из функций в x86-64: регистры, память и скрытые аргументы

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

Наверняка многие и не задумываются: а как на самом деле происходит возврат структур и других типов значений из функций? Что происходит под капотом, какие приемы задействует компилятор? В данной статье я постараюсь дать ответы на эти вопросы и сделать это просто и понятно.

Читать далее

GDB для тех, кто думает, что отладка — это фантастика

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

cout - плохой отладчик! Как за 30 секунд найти место падения программы? Какие 7 команд GDB нужно знать каждому C++ разработчику? В этой статье я делюсь личным опытом: как я боялся GDB, думал, что это «магия для гуру», а потом понял, что 70% задач решается простыми командами.

Спойлер: главный страх - это неизвестность. А когда знаешь backtracebreaknextprint и info locals, GDB становится лучшим другом. Статья рассчитана на начинающих C++ разработчиков, которые хотят перестать бояться терминала и начать отлаживать системно.

Читать далее

Как воспроизводить WebRTC видео на Qt клиенте

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

Что ж... Недавно я увлекся C++, поэтому давайте разберемся в какой-нибудь технологии и напишем по ней статью. Мой выбор пал на WebRTC и клиент на Qt.

Читать далее

От MNIST к Transformer. Часть 4. Gradient Descent. Обучаем нашу модель

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

Мы живем в эпоху, когда ИИ стал доступен каждому. Но за магией PyTorch скрывается колоссальная инженерная работа и сложные вычислительные процессы, которые для большинства остаются черным ящиком. 

Это четвертая статья из цикла От MNIST к Transformer, цель которого пошагово пройти путь от простого CUDA ядра до создания архитектуры Transformer - фундамента современных LLM моделей. Мы не будем использовать готовые высокоуровневые библиотеки. Мы будем разбирать, как все устроено под капотом, и пересобирать их ключевые механизмы своими руками на самом низком уровне. Только так можно по настоящему понять как работают LLM и что за этим стоит. В этой статье мы разберем как работает градиентный спуск, реализуем его и обучим нашу модель для распознования mnist датасета.

Приготовьтесь, будет много кода на C++ и CUDA, работы с памятью и погружения в архитектуру GPU. И конечно же математика что за этим стоит. Поехали!

Читать далее

Ночью все кошки серы, а using'и одинаковы

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

Одной из самых сложных частей C++ до сих пор считаются правила поиска имён, и ошибки связанные с name lookup проявляются обычно уже в рантайме. Код компилится и даже работает какое-то время, но при свете луны ведёт себя не так как ожидает программист. За простыми идентификаторами скрывается многоуровневая система областей видимости, категорий имён и специальных правил, и очень многое в нашем текущем стандарте растёт прямиком из восьмидесятых, частенько без изменений. Давайте посмотрим как компилятор видит имена в C++, какие области видимости существуют и почему они ведут себя по-разному.

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

Читать далее

Компилятор сократил x/x — и оказался «прав». Урок математики, который преподал gcc

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

Благими намерениями вымощена дорога в ад. Или как погоня за оптимизацией и производительностью может нарушить фундаментальные математические принципы.

Читать далее

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

Как убрать virtual и не сойти с ума: велосипедные генераторы через type loopholes

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

В C++ уже есть корутины. Есть диапазоны. Есть готовые библиотеки.

Но это не мешает взять гаечный ключ и начать собирать генератор вручную.

В предыдущей статье макросы внезапно начинают изображать из себя язык: DO, LET, IS управляют препроцессорным ритуалом и создают DSL. Это синтаксис. Это оболочка. Это фронтенд.

(чтение предыдущей статьи необязательно для понимания этой)

Но ведь есть не только синтаксис, можно создать и конкретную семантику — генераторы.

В этой статье я строю велосипедный генератор. Самый честный.

Читать далее

Как разработать устройство с нуля. Прибор измерения ёмкости конденсаторов

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

В статье проектируется с нуля мобильное устройство для измерение емкости на микроконтроллере ATmega8.

Читать далее

C3D PolyShaper: современные возможности и перспективы развития

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

Александр Лонин, руководитель группы полигонального моделирования, C3D Labs, рассказывает о функциональности и перспективах развития модуля C3D PolyShaper. Рассматриваются методы создания и обработки полигональных объектов, новые алгоритмы сшивки и улучшения в триангуляции, а также диагностика и исправление дефектов сеток. Автор делится планами по реверс-инжинирингу органических форм, работе с неявными поверхностями и учету неманифолдности в булевых операциях.

Мы консолидировали все наработки по полигональному моделированию, результатом чего стал новый модуль в составе C3D Toolkit — C3D PolyShaper. Этот модуль официально зарегистрирован в реестре отечественного программного обеспечения. Он представляет собой набор классов и функций для работы с полигональными объектами и топологией. Рассмотрим текущую функциональность модуля, направления разработки и перспективы дальнейшего развития.

Полигональный объект с топологией может быть получен несколькими способами: путем конвертации из ранее существовавшего объекта MbMesh, считыванием данных из файлов форматов JT, STL и OBJ, созданием на основе параметрической оболочки или построением вручную. При чтении данных из файла необходимо восстановить топологическую информацию — другими словами, выполнить сшивку модели. Алгоритм сшивки был усовершенствован и теперь способен обрабатывать случаи с совпадающими треугольниками, что особенно актуально при работе с моделями строительных конструкций.

Читать далее

Делаем интернет-радиоприемник на базе ESP32-S3 за один вечер

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

Всем привет, дорогие читатели! Расскажу вам о том как сделать интернет-радио на «скорую руку» без особых хлопот.

Читать далее

Использование OPC UA на нативном приложении в технологии MFC MS Visual C++

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

Ключевые аспекты проектирования и реализации SCADA-систем в автоматизированных системах управления технологическими процессами (АСУТП). Основное внимание уделяется интеграции с базами данных, такими как SQL Server, и использованию протокола OPC UA для взаимодействия с контроллерами.

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

Читать далее

Процессор в вашем компьютере угадывает будущее. И ошибается в 5% случаев

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

В прошлую пятницу я объяснял джуну, почему его код на отсортированном массиве работает в шесть раз быстрее, чем на неотсортированном. Тот же массив, тот же алгоритм, и те же данные. Просто в другом порядке. Джун смотрел на меня как на сумасшедшего и, честно говоря, я его понимаю.

Потому что ответ звучит безумно: процессор внутри вашего ноутбука постоянно пытается предсказать будущее. Буквально. Он гадает, какая ветка if выполнится ещё до того, как условие будет вычислено. И на отсортированных данных ему угадывать проще.

Ну, давайте разбираться.

Читать далее

Сколько на самом деле стоит LOG_INFO(): benchmark библиотек логирования C++

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

Логирование есть практически в каждом C++ проекте. Почти любой сервис, демон или библиотека рано или поздно обрастает строками вроде LOG_INFO(...) или logger.debug(...).

Чаще всего библиотека выбирается по привычке или популярности — spdlog, quill, easylogging++ и т.п. При этом редко кто проверяет, какую цену приложение платит за логирование.

В высоконагруженных системах логирование может выполняться:

Читать далее