Обновить
229.72

C++ *

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

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

SIMDe, дополнение к DOD архитектуре

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

Привет, Хабр!

Для начала хочу сказать огромное спасибо всем, кто прочитал и прокомментировал мою прошлую статью про Data-Oriented Design.

Честно говоря, я ожидал дискуссии, но такой накал страстей вокруг кэш-миссов, структур данных и «смерти ООП» меня приятно удивил. Приятно видеть, что оптимизация и понимание того, как данные текут через железо, всё еще волнуют сообщество.

Я внимательно изучил все ваши аргументы — от «компилятор сам всё сделает» до «это невозможно поддерживать в реальных проектах». И вместо того, чтобы отвечать каждому в ветке комментариев, я решил подготовить этот материал.

Многие из вас совершенно справедливо заметили: DOD — это круто, но какой в нем смысл, если мы упираемся в зоопарк архитектур? Мы раскладываем данные в памяти идеально ровно, но как только пытаемся применить к ним SIMD-инструкции (чтобы получить тот самый 10-кратный буст), мы попадаем в ловушку вендор-лока. Написал под Intel — не работает на ARM. Написал под ARM — не заведется в браузере.

Сегодня я хочу показать инструмент, который снимает этот вопрос и делает «низкоуровневую магию» действительно универсальной.

Речь пойдет о SIMDe (SIMD Everywhere).

Читать далее

Новости

Система частиц в The 13th Sign

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

Доброго дня всем!

Мыс друзьями делаем инди‑игру The 13th Sign, и недавно выпустили первый трейлер, он же — техническое демо. После чего в узких кругах возник широкий круг вопросов формата «как это работает». Ниже — все детали реализации.

Читать далее

Инвертирование равенства. Как реже стрелять себе в ногу в C-подобных языках

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

Встав утром и посмотрев в профиль, отметил: на Хабре много лет, писал статьи, писал код. И ни разу не писал о коде на Хабре. А вообще‑то разработчик. Поззорище! Пора исправляться.

Поговорим о классической (и болезненной) проблеме кодирования «присваивание вместо равенства» которая в любой момент может создать очень много проблем. О логическом источнике этой ошибке, и о способах решения.

Ну и ещё слегка вспомним «Звездные войны»:-)

Силу инверсии равенства познай на себе :)

Игра Сапёр на Unreal Engine > UMG > только C++ > Никаких Блупринтов

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

Захотелось мне как-то написать что-нибудь на UMG в Unreal Engine 5 и исключительно на С++ (без использования блупринтов). Заодно было любопытно краем глаза взглянуть на QT. “Пахнет небольшим проектом”, - подумал я и избрал для вдохновения игру “Сапёр” из сего репозитория -> https://github.com/Bollos00/LibreMines. Моё почтение автору той репы!

Началось всё с бездумного и медитативного переписывания… простите, портирования структуры и логики на анриловский UMG и параллельного просмотра любимых шоу на ютьюбе. Чудесное было время! Далее чуть подрефачил код, упростил его, убрал ненужное, и получилось то, что получилось. 

А ну-ка...

Cистема визуально-инерциальной навигации для дрона на C++

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

Дроны, которые работают на GPS, глушатся и это большая проблема для летательных аппаратов. Сигнал от спутников GPS проходит около 20 000 км и достигает антенны дрона с минимальной мощностью. Любая наземная глушилка, излучающая шум на частотах L1/L2/L5, для приемника дрона оказывается в тысячи раз громче спутников. Приемник слепнет, дрон теряет координаты, переходит в аварийный режим и сносится ветром.

И поэтому нам нужна MVIO (Monocular Visual Inertial Odometry).

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

Читать далее

Как я пытался внедрить IOCP в libcoro, выгорел на полгода, но вернулся с планом «Б»

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

Что делать, если в твоём очередном самописном движке внезапно понадобилась сеть, да ещё и на корутинах из C++ 20, а подходящая библиотека не поддерживает Windows? Правильно - лезть под капот, разбираться что такое epoll, почему он несовместим с IOCP, затем вкатиться в Open Source, сделав огромный PR, выгореть на полгода, чтобы потом вернуться и начать делать нормально.

Небольшая история о том, почему первый PR не должен быть огромным и как (не) нужно переписывать сетевую библиотеку.

Читать далее

far2l и буфер обмена: ускоряем bracketed paste

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

Спасибо всем, кто пришел высказаться в комментарии к моей вечерашней статье про перенос по словам в far2l. Получилась интересная дискуссия о том, что такое современный менеджер файлов, и куда ему стоит двигаться. Решил заодно написать про ещё одну недавно добавленную «фишку» far2l: ускоренную вставку из буфера терминала. Технически это может показаться очень локальной оптимизацией, но в некоторых кейсах меняет качество жизни кардинально.

Поговорим о скорости. А точнее — о том, как мы заставили far2l мгновенно «проглатывать» большие объемы текста из буфера обмена терминала, даже если вы сидите через медленный SSH на сервере, где нет иксов.

Читать далее

TinyAgent.exe: ИИ берет мышь и клавиатуру

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

Представьте: вы скидываете нейросети скриншот сложной программы (будь то Cinema 4D, Excel или 1С) и говорите: «Сделай мне вот это». И через секунду мышка на вашем экране начинает сама летать по кнопкам, выполняя работу за вас.

Это не магия и не дорогой корпоративный софт. Это tinyAgent - микро-утилита, которую можно запустить за минуту.

Читать далее

Так как же всё-таки быстро конкатенировать строки в C++?

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

Всем практикующим программистам приходится конкатенировать строки. Именно конкатенировать, у нас не какой-то там JavaScript или PHP, у нас в C++ это называется вот таким заумным словом. Программисты на других языках без излишних мудрствований строки просто "складывают", даже не особо задумываясь об этой операции. Ведь что может быть проще, чем

return "The answer is " + str_answer + ", count is " + count;

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

Читать далее

Маленький веб

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

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

Именно такие проекты, реализующие различные серверы и клиенты для веба вы найдете в этой статье.

Читать далее

Сравнение методов решения систем линейных алгебраических уравнений

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

Цель данной статьи - предоставить сравнение методов решения СЛАУ и их эффективности в разрезе времени решения и нормы невязки, характеризующей точность решения. В статье приводятся результаты решения для числа уравнений от 50 до 3000. Приводится сравнение результатов решения для методов: Гаусса, LU декомпозиции, компактной схемы исключения, QR декомпозиции, LL^T декомпозиции, методов вращений, релаксации и градиентного спуска.

Читать далее

muRPC: Реализация протокола JSON-RPC на C++

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

Данная статья описывает библиотеку muRPC для создания сервера и клиента для протокола JSON-RPC. Режим работы предполагает, что один из клиентов JSON-RPC предоставляет какие-то методы и сообщает об этом серверу. Тогда другие клиенты JSON-RPC могут эти методы вызывать и получать ответ. Сервер предоставляет маршрутизацию и валидацию сообщений между клиентами.

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

Читать далее

Компилируем TypeScript в натив: хардкор и мясо

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

Зачем вообще компилировать TypeScript?

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

Возникает логичный вопрос: что, если взять лучшие, максимально автоматизированные инструменты из веба и перенести их в мир нативных приложений без браузера и лишних прослоек? Ключевая цель — обеспечить возможность вызова C++-код из TypeScript с возвратом результата без промежуточных интерпретаторов.

Меня зовут Владимир Цышнатий @Tsyshnatiy. Я занимаюсь разработкой более 15 лет, мой основной профиль — C++. Помимо этого меня увлекают технологии на стыке разных миров. В том числе идея, лежащая в основе этой статьи: дать возможность писать на TS как на нативном языке.

Интересно узнать, как мы это делали и что получилось? Детали под катом! 

Читать далее

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

Как я делал перенос по словам в редакторе far2l

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

Привет, Хабр! Обычно в своих дайджестах разработки far2l я рассказываю сразу о пачке новостей, накопившихся за год. Но сегодня случай особый. Мы реализовали фичу, тикет на которую висел в багтрекере с 10 ноября 2016 года. Фичу, которой мне самому остро не хватало ещё со времён использования Far Manager в Windows. Фичу, к которой многие боялись подступиться из-за сложности реализации в архитектуре, заточенной под «одна строка кода = одна строка на экране». Встречайте: перенос по словам (Word Wrap) во встроенном редакторе far2l! Под катом — рассказ о том, почему это заняло 9 лет, как Junior/Middle навыков C/C++ хватило для задачи уровня Senior благодаря Gemini 2.5 и 3 Pro, и как помог процесс формат патчей .ap.

Читать далее

Создание библиотеки на C++: Наследование и Шаблоны. Часть I

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

Привет! Меня зовут Николай, я C++‑разработчик в SimbirSoft. Я подготовил цикл статей, в которых хочу поделиться своим опытом проектирования библиотек на примере решения геометрических задач и разобрать три популярных подхода к организации кода. В этой статье я расскажу про классическое наследование с виртуальными функциями и использование шаблонов. В продолжении будет еще подход, следи за обновлениями профиля.

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

Для комфортного чтения материала потребуется уверенное владение базовым синтаксисом C++, понимание принципов объектно-ориентированного программирования, а также общее представление о шаблонах и виртуальных функциях. Текст ориентирован на разработчиков среднего уровня, но может быть полезен и тем, кто только начинает глубже разбираться в архитектуре C++-библиотек.

Читать далее

Мой первый DIY-гаджет: Игра на реакцию для двух игроков на ATmega328P (без Arduino)

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

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

Я новичок в проектировании PCB-устройств, так что могу ошибаться в некоторых нюансах. Хотя у меня уже есть большой опыт в электротехнике, с хорошим знанием схемотехники и прочего, если заметите неточности или улучшения — не стесняйтесь, указывайте в комментариях, буду рад конструктивной критике!

Получилась миниатюрная игра на реакцию для двух игроков на базе ATmega328P.

Читать далее

Под капотом qDebug(): как устроено логирование в Qt и что с этим можно сделать

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

Каждый Qt-разработчик начинает знакомство с фреймворком с магической строчки qDebug() << "Hello World". Но задумывались ли вы, что происходит внутри этого вызова? Как Qt обрабатывает логи, какие есть ограничения, и главное — как это можно расширить под свои нужды?

В этой статье я разберу внутреннее устройство системы логирования Qt, покажу её сильные и слабые стороны, а затем представлю свою библиотеку QtLogger — надстройку, которая превращает базовый механизм в полноценную систему логирования корпоративного уровня.

Читать далее

Антирекурсия. Часть 1

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

Рекурсия — прекрасный инструмент математического анализа. В математике это реально полезный и фундаментальный инструмент, поэтому математики привыкают мыслить рекурсиями и активно агитируют за перенос этой логики в программирование. Благо в программировании функции технически могут вызывать самих себя. Из‑за этого возникли даже так называемые функциональные языки программирования, основанные на идее отказа от циклов в пользу «универсальной» рекурсии.

Однако, следует понимать что рекурсия в математике и рекурсия в программировании далеко не одно и тоже. Как отметил Ален И. Голуб в книге «Веревка достаточной длины, чтобы… выстрелить себе в ногу» (п. 6. Если вы не можете сказать это по‑английски, то вы не сможете выполнить это и на Си/Си++) — математическое мышление может помешать писать хорошие программы. И как раз рекурсия наглядно демонстрирует эту мысль.

Математика абстрактна — в ней рекурсия работает в рамках математической логики, а это скорее логика вида «что было бы, если бы функция вызывала сама себя» — реальных вызовов функцией самой себя там нет — математики не вычисляют рекурсии пошагово (как это делает компьютер) поэтому там нет и описанных ниже побочных эффектов появляющихся у рекурсии в программировании. В математике рекурсия более универсальна чем цикл, но в программировании всё наоборот — здесь цикл намного гибче и универсальнее.

Негативные эффекты от рекурсии в программировании носят алгоритмический характер поэтому компиляторы языков программирования общего назначения не могут оптимизировать рекурсию — она неуправляема даже для программиста, не то что для компилятора. Компиляторы функциональных языков программирования умеют преобразовывать так называемую «хвостовую» рекурсию в цикл, убирая её негативные эффекты. Но «хвостовая» рекурсия позволяет реализовать лишь простейшие варианты рекурсии. В общем случае рекурсия эквивалентна нескольким псевдоциклам и анализ количества и функционала этих псевдоциклов нетривиален, а потому не подлежит оптимизации компилятором. По сути «хвостовая» рекурсия не более чем «заплатка» позволяющая вернуть в функциональные языки программирования опрометчиво удалённые из них циклы. Вред от мышления рекурсиями в программировании будет рассмотрен ниже на конкретных примерах.

Читать далее

Инференс нейросетевых моделей для табличных данных с помощью ONNX Runtime на C++

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

ONNX Runtime (ORT) — это высокопроизводительный движок для выполнения моделей в формате Open Neural Network Exchange (ONNX). Он предлагает оптимизированные реализации для CPU и GPU, поддержку различных аппаратных ускорителей и, что ключевое, простой C++ API. В этой статье мы разберем, как выполнить инференс модели для табличных данных, используя ONNX Runtime в C++ проекте.

Ссылка для скачивания: Библиотеку можно получить через официальный GitHub (сборка из исходников). Для простоты в проектах часто достаточно забрать предсобранные бинарники из релизов.

Читать далее

librats: Выпуск версии 0.7.x (новая библиотека для распределённых P2P-приложений). Так же релиз rats-search 2.0

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

Всем привет! Я продолжаю развивать свою библиотеку для создания распределённых приложений, которая уже легла в основу новой версии rats-search (распределенного торрент-поисковика).

Она позволяет развернуть собственную P2P-сеть и связать пользователей между собой. Главная особенность — автоматическое обнаружение участников (peer discovery), что крайне актуально в условиях постоянных блокировок и ограничений сети.

На данный момент библиотека поддерживает языки C/C++, Android (Java), Python и Node.js.

С момента выхода прошлой статьи накопилось много приятных изменений, о которых я и хочу рассказать. Кроме того, в этот раз я затрону и сам rats-search новой версии.

Последний стабильный релиз на сегодня — 0.7.0. Исходный код и бинарные файлы доступны для скачивания для:

Читать далее
1
23 ...