
C++ *
Типизированный язык программирования
Быстрый доступ к map по ключу строке
Требования к библиотеке все теже:
- Кроссплатформенность;
- Минимум зависимостей;
- Скорость чтения;
- Простой синтаксис;
Пример конфига
{
"objects":
[
{
"id": "object1",
"events":
{
"event1":{
"give": {"object2": 4}
},
}
},
{
"id": "object2",
"events":
{
"event2":{
"give": {"object1": 3}
},
},
{
"id": "object3",
"events":
{
"event3":{
"give": {"object3": 4}
},
}
},
Первая и самая простая идея которая напрашивается это:
std::map<std::string,script> events;
Но опять же если это высоконагруженная часть программы то поиск по map может быть достаточно долгим, хэши могут дать колизии чего совсем не хочется.
Вторая идея парсить этот конфиг в 2 прохода тогда на 2-м проходе object1, object2, object3 будут уже известны и можно будет записать на них прямо указатели или ссылки. Но если зависимости еще более сложные то такой подход может и не сработать.
Я предлагаю способ позволяющий существенно сократить runtime издержки подобных конструкций
Динамическое программирование в шаблонах
Что из этого получилось можно посмотреть внутри.
Объектный пул и быстрое создание объектов в куче
Поиск RSS новостных сайтов

Покопался я ещё в своих старых и не очень проектах и нашёл одну интересную программку. Она ищет RSS ссылки новостных сайтов. Задача которая стояла — это найти как можно больше новостных RSS лент и собрать их всех в одну базу.
Когда встал вопрос о том как искать новостные сайты, пришла мысль о использовании сервиса news.google.com. От туда можно выдёргивать ссылки на новостные сайты, к тому же они постоянно добавляются и отсортированы по регионам, темам и т.д. Осталось пройтись по всем разделам news.google.com, выдернуть ссылки новостных сайтов, а затем найти все RSS каждого из них.
Динамический поиск потенциальных взаимоблокировок
Боржоми пить поздно, причитать насчёт архитектуры бессмысленно. Подключаем тяжелую артиллерию.
Как обеспечить надлежащее пересечение границ динамической библиотеки, используя пользовательские средства удаления смарт-указателей
new
должно вообще исчезнуть (ну, по крайней мере, когда в С++14 пофиксят отсутствие std::make_unique
). Все динамические выделения памяти должны быть инкапсулированы или в стандартную библиотеку, или контейнеры типа std::vector
, или интеллектуальные указатели. Смарт-указатели стандартной библиотеки могут быть настроены так, чтобы они сами занимались освобождением занимаемой ими памяти. Эта возможность и заложена в основу ответа на вопрос, поставленного в заголовке статьи.
Объект является пересекающим границу динамической библиотеки, если он инициализируется в одном блоке, а используется в другом. Это происходит, когда, например, в dll инициализируется объект и возвращается указатель на него.
Предположим, одна библиотека (или исполнимый модуль) связывается с другой библиотекой, используя фабрику для динамической инициализации объекта и получения указателя на него. Блок, который использует этот указатель, может удалить указатель для освобождения области памяти, на которую он указывает. Если библиотека, которая выделяет память и блок, работающий с указателем, используют различные версии динамического выделения памяти ОС (CRT в Windows), то возникнет ошибка. Пример этой проблемы (в случае с Windows):

Перевод SDL Game Framework Series. Часть 3 — SDL Events
А понимаете ли Вы move семантику?
Еще вчера я честно думал, что разобрался как работают rvalue references в C++11. Думал до тех пор, пока не наткнулся на грабли.
Итак, я предлагаю размять мозги и попробовать написать функцию move_if_rr. Такой себе тест на понимание: успех засчитывается за функцию, которая работает правильно при условии, что Вы ее ни разу не отлаживали. Детали задания под катом.
Демистификация unaligned access undefined behavior в C
Неопределённое поведение (Undefined Behavior, UB) в C и C++ — одна из причин, по которым разработчики всё чаще ищут языки с полностью определённой семантикой. Одним из самых коварных UB является unaligned access, с точки зрения стандарта C это, например, когда происходит попытка разыменовать указатель как uint32_t, а значение указателя (адрес) не кратно четырём. Один из частых сценариев использования, приводящих к такому UB - получение данных по сети и их интерпретация как чисел.
Как вызывать C++ из Python

Сравнение PyBind11 vs ctypes
В принципе, можно вызывать C++ из Python двумя способами: при помощи библиотеки PyBind11 для C++, которая готовит модуль Python, либо при помощи пакета cytpes для Python, который предоставляет доступ к скомпилированной разделяемой библиотеке. Работая с PyBind11, не составляет труда совместно использовать множество типов данных, в то время как ctypes — это гораздо более низкоуровневое решение в стиле C.
Взявшись за описанный здесь проект, я хотел рассчитывать на производительность и переносимость C++, но так, чтобы не жертвовать интерактивностью интерпретируемых языков, которая удобна для экспресс-исследования и отладки.
К счастью, вызывать C++ из Python не так сложно, как может показаться на первый взгляд. Таким образом, можно в какой-то степени позаимствовать интерактивность Python при разработке кода C++.
QapDSL — декларативное описание AST и парсеров для C++

QapDSL — декларативное описание AST и парсеров для C++
QapDSL — это специализированный язык (DSL), который позволяет описывать абстрактные синтаксические деревья (AST) и правила их разбора для языков программирования, прежде всего C++. Такая формализация помогает автоматизировать построение парсеров, генерацию кода, анализ исходников и даже рефакторинг.
Зачем нужен QapDSL?
- Компактно и наглядно описывать структуру и грамматику языка.
- Автоматически генерировать C++-структуры, парсеры, сериализаторы и визиторы.
- Ускорять эксперименты с языками, создавая прототипы компиляторов и анализаторов.
- Упрощать анализ и рефакторинг сложных языков, в т.ч. C++.
Пример QapDSL-описания
Рассмотрим, как описывается объявление класса C++ на QapDSL:
t_class{ string keyword; t_sep sep0; string name; t_sep sep1; TAutoPtr<t_parents> parents; t_sep sep2; TAutoPtr<t_class_body> body; t_sep sep3; { M+=go_any_str_from_vec(keyword,split("struct,class,union",",")); O+=go_auto(sep0); M+=go_str<t_name>(name); O+=go_auto(sep1); O+=go_auto(parents); O+=go_auto(sep2); O+=go_auto(body); O+=go_auto(sep3); M+=go_const(";"); } }
Полезные материалы для C++ разработчиков от PVS-Studio

Мир C++ активно развивается, сообщество программистов обсуждает новые фичи, инструменты и лучшие практики. В этой статье собраны полезные материалы, которые стоит посмотреть каждому C++ разработчику.
Ближайшие события
Устанавливаем Qt на Windows без регистрации и vpn (почти). Часть 2. В мире зеркал

Последние время установка фреймворка Qt через официальный qtinstaler у пользователей из России несколько осложнена. Однако, существует ряд альтернативных вариантов получения необходимых библиотек (методы отсортированы от сложного и долгого к простому и быстрому):
HowTo: создание двоичного SDK(набора библиотек) для Windows с использованием vcpkg

В этом HowTo мы рассмотрим подготовку пакетов vcpkg
для использования в двоичном виде.
В качестве "подопытных кроликов" будут выступать Qt6
, QCustomPlot
и я.
Spoiler: с QCustomPlot
придется немного пострадать, но обычно все проще.
TLDR: vcpkg export
Editor Scripting в Unreal Engine: создание утилит для генерации Actor и Data Asset

Привет, Хабр! В этой статье я поделюсь своим опытом создания утилит в Unreal Engine, которые автоматизируют процесс генерации Actor Blueprint и Data Asset. Эти утилиты значительно упрощают работу дизайнерам уровней, помогая сократить время на рутинные задачи и минимизировать ошибки, а также могут быть полезны в широком спектре задач, связанных с разработкой.
Мы рассмотрим, как использовать Editor Utility Widgets на практике, чтобы упростить работу в редакторе. Основная часть будет выполнена в Blueprint, но для решения отдельных задач нам также понадобятся функции на C++. Помимо этого, я расскажу о важных аспектах работы с Asset Registry, фабриками ассетов и Subobject Data Subsystem.
Можно ли собрать в одном большом гайде всё, что полезно знать о языке C и его применениях

Мне показалась очень интересной тема открытая в недавней статье
Собрал в одном большом гайде всё, что хотел бы знать, когда изучал язык C
Во вступлении там написано:
"Очевидный факт: язык C — это основа большого количества современных экосистем программирования. Он обеспечивает фундамент многих операционных систем, базовых библиотек и системных инструментов."
Мне кажется полезно все таки обозначить в каком смысле язык C — это основа, и чем он обеспечивает фундамент. Я рад что имею возможность сформулировать что-то в данном направлении не со слов иностранного авторитета, а не базе собственного опыта который, тем не менее, формировался на основе анализа-применения действующих решений-теорий сформулированных во многом иностранными специалистами, но надеюсь с примесью собственной креативности в какой-то степени. Ну и хочется озвучить свой ответ на вопрос: "Когда C — идеальный выбор?", может в интерпретации: "А бывает ли язык Си идеальным выбором?"
По моему, тема очень полезная, хотелось бы увидеть и поддержать ее развитие.
Дебажим баги в дебаггере x64dbg. «Шаг с выходом» в GUI

С отладчиком нужно как-то взаимодействовать: через текстовый или графический интерфейс. В "оболочке" программы с хорошо отлаженным ядром может оказаться неприятный баг, и пользователю это вряд ли понравится. Любому разработчику не хотелось бы допускать такой ситуации.
Увеличение лидирующих нулей в симметричной разреженной матрице
В предыдущей статье было показано, что при решении СЛАУ с симметричной разреженной матрицей наличие лидирующих нулей приводит к уменьшению количества вычислений. В этой статье будет представлен алгоритм, предназначенный для увеличения количества лидирующих нулей данной матрицы. Если переставить i-ую и j-ую строки, а также i-ый и j-ый столбцы, то матрица останется симметричной. Такие перестановки называют симметричными. Они могут менять количество лидирующих нулей и, если их правильно применять, то количество лидирующих нулей можно увеличить. Другими словами, нам надо сделать так, чтобы все ненулевые члены по возможности находились возле главной диагонали. В частности, если известно, что матрица - ленточная, то делать ничего не надо.
Предлагается следующий алгоритм.
Вначале выбираем столбец ( или строку, что неважно, так как матрица симметричная ) с минимальным числом ненулевых элементов. Если таких столбцов несколько, то выбирается какой-то из них. При помощи симметричной перестановки делаем этот столбец первым.
Таким образом количество нулей в этом столбце будет максимальным. Далее строки в которых были не нули игнорируем. Находим столбец с минимальным числом ненулевых элементов без учёта этих строк и делаем его следующим. И так далее пока не пройдём всю матрицу.
Ниже помимо краткого текстового описания программы приводится много кода на С++, который сам по себе является точным описанием алгоритма.
Logger C++

Этот проект представляет собой простую и гибкую библиотеку для логирования на C++. Библиотека поддерживает разные уровни логирования, форматирование сообщений и возможность записи логов в разные потоки.
Вклад авторов
Andrey2008 7246.2dalerank 2718.0tangro 2409.0SvyatoslavMC 2388.0antoshkka 2369.4haqreu 1500.0olegchir 968.2khizmax 945.4eao197 909.0Kelbon 783.0