Обновить
256K+

C++ *

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

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

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

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

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

Читать далее

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

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

Не так давно возникла задача в 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.5K

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели7.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 году провели масштабные тесты по отслеживанию темпов роста китайского ВВП. Они подтвердили преимущество нелинейных функций активации.

Читать далее

Путеводитель по чужим STL

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

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

EA, Facebook, Google, Adobe, LLVM и рядок компаний поменьше тратят человеко-десятилетия в поисках ответа на главый вопрос жизни, Вселенной и всего такого «почему std:: это медленно, непредсказуемо и жрёт память». По аналогии с прошлой статьей вам не потребуется знать стандарт наизусть, а будет достаточно понимать, что такое указатель, чем вектор отличается от дерева и почему промах в кеше это дорого, а дальше я пройдусь по разным стандартным библиотекам и про каждую немного расскажу, что это, зачем оно появилось и где об него можно больно удариться, потому что про вот этот последний пункт обычно забывают "продаваны" и прочие студийные еванглелисты, когда расказывают какое там всё красивое, легкое и с++двадцатое.

Читать далее

Лямбды в C++: пять задач на захваты и время жизни, в которых ошибается даже опытный разработчик

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

Лямбды в C++ выглядят безобидно, пока не начинают жить дольше переменных, которые захватили. Висячие ссылки, мёртвый this, копии состояния в потоках и ограничения std::function часто проходят компиляцию без шума, зато потом превращаются в undefined behavior.

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

Разобрать задачи

Подробно об ABI для работы с C++

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

Двоичный интерфейс приложений, чаще именуемый просто ABI — это концепция, которая кажется знакомой и незнакомой одновременно. В каком смысле знакомой? Об ABI часто говорят в контексте устранения неисправностей, упоминают в статьях. Иногда даже приходится решать проблемы с совместимостью, которые провоцирует этот интерфейс. А в каком смысле незнакомый? Дело в том, что, если кто-то попросит вас описать, что такое ABI — то вы обнаружите, что понимаете, о чём речь, но чётко сформулировать ответ на этот вопрос сложновато. В конце концов, можно ограничиться формулировкой, указанной в Википедии: «набор соглашений для доступа приложения к операционной системе и другим низкоуровневым сервисам, спроектированный для переносимости исполняемого кода между машинами, имеющими совместимые ABI». Возникает ли проблема с такой формулировкой? Нет, в качестве общего описания этого вполне достаточно. Но оно может казаться немного поверхностным.

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

Читать далее

Что нового в C++29: итоги июньской встречи в Брно

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

13 июня закончилась встреча комитета по стандартизации C++ (также известного как WG21) в Брно (Чехия), на которой комитет работал над будущим стандартом C++, C++29. В этой статье кратко пересказаны все принятые в него нововведения с примерами их использования и ссылками на оригинальные пропозалы для тех, кто захочет познакомиться с ними детально.

Читать далее

Пишем CFD solver для симуляции потока воздуха (часть 1)

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

Недавно передо мной встала задача расчетной гидро-газо динамики, надо было посчитать сопротивление воздуха, форму огибающего потока, все то, что требовалось, чтобы посчитать траекторию летящего тела. В этой статье я подробно написал и объяснил, как создать CFD solver.

Читать далее