Обновить
128K+

C++ *

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

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

Как уместить 26 типов виджетов, RTL и веб‑сокет в килобайты флеша ESP32 — и при чём тут ИИ

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

Каждый мой проект на ESP32 заканчивался одинаково: микроконтроллер готов, датчики читаются, реле щёлкают — а дальше надо руками писать HTML, CSS, JS и протокол поверх веб‑сокета, чтобы увидеть пару графиков в браузере. На третий раз я решил, что хватит, и сделал библиотеку RisalDash: интерфейс описывается на C++ в несколько строк, а весь фронтенд и протокол генерируются сами и отдаются самим контроллером.

Читать далее

Что лучше — C++ или C#?

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

Самым фатальным недостатком C++ является то, что он скоро умрёт. То, что C++ скоро умрёт — это истина, проверенная временем. 30 лет назад все говорили, что C++ скоро умрёт, потому что появилась Java. 20 лет назад ему пророчили скорую смерть, потому что к Джаве присоединился C#. 10 лет назад C++ должен был умереть, потому что появился Rust. 3 года назад его снова принялись хоронить, когда АНБ выпустило спорную рекомендацию «переходить на memory-safe языки» везде, где это возможно, и я думаю, что ещё через 30 лет тоже все будут говорить, что C++ скоро умрёт.

Откуда столько пессимизма? Считается, что C++ неудобен в использовании, и из-за неочевидных правил языка на нём слишком легко написать опасный и забагованный код. В этой статье я сравню C++ и C# в тех аспектах, которые определяют простоту и удобство использования — насколько легко и приятно писать на этих языках, и какой из них вызывает наименьшее количество боли.

Я не собираюсь ничего набрасывать на вентилятор или разводить холивар, а просто хочу объективно и беспристрастно ответить, наконец, на вечный вопрос: что же всё-таки лучше — C++ или C#?

Объективное и беспристрастное сравнение

Симулятор логических схем с программируемыми гейтами на Lua

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

Всем привет, недавно я написал симулятор логических гейтов или вентилей на С++ (sfml для графики + sol2 для интеграции луа скриптов), которые можно программировать на луа таким образом: ```

Читать далее

C3D Collision Detection: быстрое выявление коллизий в 3D-сценах

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

Роман Садовников, к.т.н., программист C3D Solver, C3D Labs, рассказывает о нововведениях в модуле C3D Collision Detection.

Модуль C3D Collision Detection применяется в различных отраслях, включая авиационную и автомобильную промышленность, где он служит для управления движением беспилотных транспортных средств (рис. 1). В робототехнике модуль обеспечивает безопасное перемещение станков ЧПУ в динамичной среде, автоматизацию упаковки и предотвращение столкновений с людьми. В игровых и медицинских приложениях модуль отвечает за обработку столкновений виртуальных объектов и используется в тренажерах для обучения проведению операций. В строительстве и логистике C3D Collision Detection помогает контролировать зазоры, реализовывать 3D-проектирование и автоматизировать строительные процессы.

Читать далее

Отрежьте мне миллиард символов: как C++20, string_view и шаблонный ад могут скрывать баг годами

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

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

Вот очередная статья о том что метапрограммирование и код с шаблонами не такие уж и плохие.

Но я хочу рассказать вам историю одного детективного расследования в недрах крупного OpenBMC-проекта (экосистема серверных платформ swtSyst). Это история о том, как безудержное желание перенести всё в compile-time (constexpr), помноженное на ультрасовременный синтаксис C++20, породило идеальный «молчаливый баг» (silent failure). Он мог бы годами жить в продакшене, успешно компилировался, не выдавал ни одного ворнинга, но полностью ломал логику работы приложения.

Если вы любите метапрограммирование, шаблоны, операторы свёртки (fold expressions) и тонкости работы с памятью в C++ — устраивайтесь поудобнее. Мы отправляемся в шаблонный ад.

Читать далее

Direct 2D #12. Слои и эффекты

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

Здравствуйте! Продолжается серия статей по Direct 2D. В них были рассмотрены такие темы, как "Слои" и "Эффект", а также в конце приведён список всех тем по Direct 2D, которые я планирую рассмотреть

Читать далее

Делаем свое контекстное меню для полей ввода в Qt на мобильных устройствах

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

Не так давно возникла задача в Qt QML проекте обработать вставку изображения в поле ввода. Понимаю, что не каждый день приходится писать кроссплатформенные клиенты для настольных и мобильных систем, но если у тебя была похожая задача, то данная статья может быть тебе интересна.

Читать далее

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

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

После написания статьи про NormIs-1 я решил углубиться в тему оптимизации модели. Архитектура была неплохой и показала адекватные результаты на метриках интеллекта, но скорость сильно проседала. Проблема была в Depthwise Conv, а именно - множестве обращений к памяти. Между блоком внимания и FFN стоял небольшой блок сверток и тормозил все вычисления. Именно его я и решил ускорить.

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

Нет, все будет 'проще' - мелкая CNN + кастомное MLX-ядро для инференса + бенчмарки скорости

Читать далее

Шаблоны C++ как инструмент архитектуры: compile-time dispatch, type traits и type erasure

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

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

Но, на мой взгляд, проблема не в самом инструменте, а в том, как именно его применяют.

Шаблоны в C++ - это не только std::vector и универсальные функции. В серьёзном C++ они часто используются как архитектурный механизм, позволяют переносить часть решений из runtime в compile-time, задавать контракты на уровне типов, собирать поведение из политик и писать обобщённый код без лишней runtime-стоимости.

Читать далее

OSDEV: Разработка аллокатора на С++ часть 5. osdev-libstdc

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

Приветствую!

Это обзорная статья на этот раз совсем простая. Используется уже написанный аллокатор. Я лишь ставлю в известность читателей о существовании в osdev-libstdc вполне стандартных функций aligned_alloc, malloc, calloc, realloc и free. Их реализация примитивна:

Читать далее

osdev-libstdc: реализация std::atomic и spin_lock

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

Приветствую!

В моей библиотеке ядра уже есть аллокатор, семейство vsnprintf, ctype, string.h, strings.h. Остались только атомики и спинлок, и тогда можно будет доделать семейство malloc в блокировками как того требует стандарт.

Читать далее

Direct 2D #11. Анимации

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

В этой статье разбираются способы реализации анимации, используя Direct2D, а также дальнейшие идеи для статей.

Читать далее

Создаем потокобезопасную очередь с условными переменными: «академический» пример против реальности

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

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

Какое отношение этот пример имеет к работе с потоками в программировании? Дело в том, что решить задачу синхронизации конкурентных операций можно также несколькими способами, близкими к ситуации выше. Меня зовут Александр, я разработчик на С++ в YADRO, и в этой статье я разберу несколько вариантов эффективной организации ожидания потоков. 

Читать далее

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

Pet-project: мини-библиотека по линейной алгебре

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

Статья о пет-проекте — попытке создать мини-библиотеку по линейной алгебре с небольшим функционалом для работы с матрицами.

Читать далее

Пять ошибок начинающих C++ разработчиков при работе с памятью, из‑за которых программа крашится

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

Большинство ошибок с памятью в C++ не выглядят как ошибки. Код компилируется, тесты проходят, приложение работает неделями. А потом внезапно появляется Segmentation fault, повреждённая куча или утечка памяти, которую приходится искать часами.

Разберём пять типичных ловушек, в которые регулярно попадают начинающие разработчики.

Читать далее

Deckhouse Prom++: как мы сжали разметку метрик Prometheus и снизили расход памяти в 2,5 раза с помощью статистики данных

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

Хотели избежать копирования данных, придумали свою служебную разметку, а потом обнаружили: она занимает почти столько же места, сколько сам исходный текст. Мы перестали гадать, посмотрели на реальные данные и применили простые, но эффективные подходы: числа переменной длины, отказ от double в пользу целых типов и умные if-else вместо switch

Итог: мы сжали разметку в 2,5 раза и при этом даже немного выиграли в скорости. Рассказываем, как знание предметной области помогло нам не усложнять код, а сделать его быстрее и легче.

Читать далее

НЕкурс про создание собственного языка программирования: вдохновляемся неожиданными открытиями, чтобы сделать свои

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

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

Читать далее

Source generators в.NET: как они вытеснили рефлексию из стандартной библиотеки

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

Ещё несколько лет назад рефлексия считалась нормой для.NET‑приложений. Сегодня Microsoft последовательно выносит всё больше работы из runtime в этап компиляции: JSON‑сериализация, логирование, регулярные выражения, конфигурация и даже тестовые фреймворки всё чаще опираются на source generators.

Разбираемся, почему рефлексия начала сдавать позиции, где кодогенерация уже стала стандартом и что это меняет для разработчиков.NET.

Читать далее

Move‑семантика в C++: пять задач, в которых легко ошибиться

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

В C++ часть ошибок выглядит слишком безобидно, чтобы сразу насторожиться: std::move в return, emplace_back «для скорости», перемещение из const, move‑конструктор без noexcept. Код компилируется, тесты могут проходить, а потом внезапно появляются лишние копирования, просадки производительности и странное поведение объектов.

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

Разобраться в move

Архитектура высокоэффективных нейросетевых вычислений на C++ для прогнозирования динамики ВВП

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

Принято считать, что для анализа макроэкономики и прогнозирования ВВП необходимы мощные серверы. Обычно разработчики используют Python и тяжелые библиотеки вроде TensorFlow или PyTorch. Однако бывают случаи когда надо чтобы модель была доступна на обычно ноутбуке или мы хотим применить наработки модели и переложить их на платы ардуино с лимитом памяти 32 кб и ценой в розничном магазине 300 - 400 рублей за штуку?

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

Вообще идея применять нейронные сети для предсказания экономических процессов зародилась в конце XX века. Ученые искали замену обычным линейным моделям. Одними из первых нелинейные свойства ИНС для макроэкономических рядов США исследовали N. R. Swanson и H. White [2]. Они доказали, что гибкие связи лучше находят скрытые циклы.C.-M. Kuan и T. Liu [4] выявили, что очистка данных перед подачей в сеть сильно снижает ошибку. В начале 2000-х годов началось активное сравнение нейронных сетей с классическими методами вроде ARIMA. M. Marcellino [5], K. Neusser и M. Wagner [9] доказали превосходство многослойных сетей при анализе ВВП европейских стран на длинных дистанциях, а переключение весов C.-M. Lin и P.-H. Chen [7] помогает предсказывать кризисные периоды. Современный этап связан с обработкой больших массивов информации. В Индии S. Ghosh [6], M. C. Medeiros с соавторами [8] успешно применили нейросети для поиска скрытых зависимостей в индийской экономике.Q. Zhang и Y. Bian [3] в 2024 году провели масштабные тесты по отслеживанию темпов роста китайского ВВП. Они подтвердили преимущество нелинейных функций активации.

Читать далее