😱🤦♂️ Опечатки, нулевые указатели и коварный таб: 33 фрагмента в библиотеке GTK
GTK — популярный фреймворк с открытым исходным кодом для создания графических интерфейсов. Библиотека позволяет кроссплатформенно реализовывать графический пользовательский интерфейс. Полностью бесплатна и имеет открытый исходный код, лицензированный под GNU GPL, что позволяет использовать её в любых проектах (даже коммерческих).
На примерах своего проекта, автор показывает, как можно анализировать ошибки в коде, опечатки и неточности.
Подобные проверки не являются эффективным способом использования анализатора, а только демонстрируют его возможность находить баги и помогать при обзорах кода. Статический анализатор следует использовать регулярно, а не от случая к случаю.
Читать статью
#гайд
GTK — популярный фреймворк с открытым исходным кодом для создания графических интерфейсов. Библиотека позволяет кроссплатформенно реализовывать графический пользовательский интерфейс. Полностью бесплатна и имеет открытый исходный код, лицензированный под GNU GPL, что позволяет использовать её в любых проектах (даже коммерческих).
На примерах своего проекта, автор показывает, как можно анализировать ошибки в коде, опечатки и неточности.
Подобные проверки не являются эффективным способом использования анализатора, а только демонстрируют его возможность находить баги и помогать при обзорах кода. Статический анализатор следует использовать регулярно, а не от случая к случаю.
Читать статью
#гайд
👍9🤔9
🧑🍳📊 The Ranges Library в C++20
Благодаря библиотеке ranges работа с библиотекой STL стала намного удобнее. Прежде всего, алгоритмы библиотеки ranges ленивы, могут работать непосредственно с контейнером и могут быть закомпожены. Кроме того, библиотека ranges имеет несколько уникальных дизайнерских решений.
Непосредственно в контейнере
Библиотека ranges позволяет контейнеру, такому как std::ranges::sort, напрямую работать с контейнером.
Напротив, классический std::sort работает с диапазоном, определенным двумя итераторами: std:sort(myVec.begin(), myVec.end()).
Продолжение истории вот
#гайд
Благодаря библиотеке ranges работа с библиотекой STL стала намного удобнее. Прежде всего, алгоритмы библиотеки ranges ленивы, могут работать непосредственно с контейнером и могут быть закомпожены. Кроме того, библиотека ranges имеет несколько уникальных дизайнерских решений.
Непосредственно в контейнере
Библиотека ranges позволяет контейнеру, такому как std::ranges::sort, напрямую работать с контейнером.
Напротив, классический std::sort работает с диапазоном, определенным двумя итераторами: std:sort(myVec.begin(), myVec.end()).
Продолжение истории вот
#гайд
👍17
🧑💻⏳ Обработка строковых литералов во время компиляции
С момента добавления constexpr можно многое делать во время компиляции. Одной из таких вещей является обработка строковых литералов.
Поиск строк в бинарнике
Если вы объявите переменную типа const char* str = «Hello World»;, строка «Hello World» будет в бинарнике.
В Linux, macOS и Windows есть команда strings. (для Windows необходимо установить Sysinternals Suite)
Запуск strings [your_binary] выведет список всех строк — «Hello World» должен быть среди них.
Далее примеры кода и несколько фишек
#гайд
С момента добавления constexpr можно многое делать во время компиляции. Одной из таких вещей является обработка строковых литералов.
Поиск строк в бинарнике
Если вы объявите переменную типа const char* str = «Hello World»;, строка «Hello World» будет в бинарнике.
В Linux, macOS и Windows есть команда strings. (для Windows необходимо установить Sysinternals Suite)
Запуск strings [your_binary] выведет список всех строк — «Hello World» должен быть среди них.
Далее примеры кода и несколько фишек
#гайд
👍8❤2🔥1
🧑🎓😎 Опыт создания UI библиотеки на C++
Все базируется на двух сущностях — Window и Control. Окно может содержать контролы, также само окно является контролом.
Control — это любой визуальный элемент для взаимодействия с пользователем — кнопка, поле ввода, список, меню и т.д. Control знает, как обрабатывать события, поступающие от Window, хранит свои состояния и рисует себя на графическом контексте, который предоставляется содержащим его окном.
Window — принимает системные события и обеспечивает их рассылку подписчикам. Так же окно дает команду на перерисовку своих контролов и предоставляет им свой graphic. Кроме этого, окно управляет фокусом ввода, может сделать модальность и отправить подписанному пользователю или в систему событие.
Graphic — предоставляет интерфейс к системным методам рисования. В настоящий момент, реализовано рисование на Windows GDI/GDI+ и Linux xcb/cairo. Разумеется, нет никаких препятствий реализовать рисование на vulcan/bare metal/etc.
В библиотеке также есть вспомогательные средства для работы — структуры common (содержит такие основные типы, как rect, color, font), event (события мыши, клавиатуры, внутренние и системные события), graphic (для физической отрисовки на системном графическом контексте) theme (система констант для удобной поддержки визуальных тем) , locale (подсистема для удобного хранения текстового контента), config (для удобной, единообразной работы с настройками приложения)
Далее подробное описание процесса и куча кода
#гайд
Все базируется на двух сущностях — Window и Control. Окно может содержать контролы, также само окно является контролом.
Control — это любой визуальный элемент для взаимодействия с пользователем — кнопка, поле ввода, список, меню и т.д. Control знает, как обрабатывать события, поступающие от Window, хранит свои состояния и рисует себя на графическом контексте, который предоставляется содержащим его окном.
Window — принимает системные события и обеспечивает их рассылку подписчикам. Так же окно дает команду на перерисовку своих контролов и предоставляет им свой graphic. Кроме этого, окно управляет фокусом ввода, может сделать модальность и отправить подписанному пользователю или в систему событие.
Graphic — предоставляет интерфейс к системным методам рисования. В настоящий момент, реализовано рисование на Windows GDI/GDI+ и Linux xcb/cairo. Разумеется, нет никаких препятствий реализовать рисование на vulcan/bare metal/etc.
В библиотеке также есть вспомогательные средства для работы — структуры common (содержит такие основные типы, как rect, color, font), event (события мыши, клавиатуры, внутренние и системные события), graphic (для физической отрисовки на системном графическом контексте) theme (система констант для удобной поддержки визуальных тем) , locale (подсистема для удобного хранения текстового контента), config (для удобной, единообразной работы с настройками приложения)
Далее подробное описание процесса и куча кода
#гайд
❤5👍2🔥1👏1
🎯✏️ Реализация #embed для C и C++
Речь пойдет о реализации директивы бинарного включения данных в gcc и clang для C и C++.
Автор опишет способ, которым реализовал #embed для GCC и Clang, и стиль работы, который использовал для ранней версии #embed. Будет использоваться общедоступная версия #embed, которая предложена Clang, в качестве инструмента для отображения одного из используемых методов, позволяющих получить гарантированное ускорение для подмножества случаев, которые имеют значение (например, инициализация массива char/signed char/unsigned char).
Изучить материал
#гайд
Речь пойдет о реализации директивы бинарного включения данных в gcc и clang для C и C++.
Автор опишет способ, которым реализовал #embed для GCC и Clang, и стиль работы, который использовал для ранней версии #embed. Будет использоваться общедоступная версия #embed, которая предложена Clang, в качестве инструмента для отображения одного из используемых методов, позволяющих получить гарантированное ускорение для подмножества случаев, которые имеют значение (например, инициализация массива char/signed char/unsigned char).
Изучить материал
#гайд
🔥4👏2👍1
Потоки могут быть на удивление медленными. Например, если вы хотите анализировать числа, то эта процедура C++ близка к наихудшему возможному выбору с точки зрения производительности:
std::stringstream in(mystring);
while(in >> x) {
sum += x;
}
return sum;
Проведем эксперимент — возьмем строки, содержащие символ «%», и создадим новые, в которых символ % заменен на %25, но остальная часть строки остается неизменной.
Простая конструкция строки выглядит следующим образом:
std::string string_escape(const std::string_view file_path) {
std::string escaped_file_path;
for (size_t i = 0; i < file_path.length(); ++i) {
escaped_file_path += file_path[i];
if (file_path[i] == '%')
escaped_file_path += «25»;
}
return escaped_file_path;
}
Оптимизированная версия с использованием потоков выглядит следующим образом:
std::string stream_escape(const std::string_view file_path) {
std::ostringstream escaped_file_path;
for (size_t i = 0; i < file_path.length(); ++i) {
escaped_file_path << file_path[i];
if (file_path[i] == '%')
escaped_file_path << «25»;
}
return escaped_file_path.str();
}
Продолжить изучение
#гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩17👍4🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Верле: разрешаем коллизии (часть 1)
Всех приветствую! Сегодня мы попробуем написать некое подобие простейшего физического движка. Введение Из жизни мы знаем, что если точка в момент времени имеет координаты , и двигается в этот момент...
👍30🤩19❤1🔥1🥱1
🧑🔬🏥 CLI'нический парсинг
Каждый программист однажды получает по голове необходимостью парсить аргументы командной строки. Кого-то этот удар сломит и заставит написать несколько сотен строк кода, по которому потом будут восстанавливать интерфейс программы следующие поколения, другие сделают наборы рантайм мап и начнут оперировать строками, по которым будет уже непонятно, то ли это так и должно быть, то ли опечатка... Последние в порыве отчаяния возьмут целый boost для этой задачи, а тот сведётся всё к тем же рантайм мапам и строкам.
Здесь вы найдете увлекательный процесс создания этого Франкенштейна
#гайд
Каждый программист однажды получает по голове необходимостью парсить аргументы командной строки. Кого-то этот удар сломит и заставит написать несколько сотен строк кода, по которому потом будут восстанавливать интерфейс программы следующие поколения, другие сделают наборы рантайм мап и начнут оперировать строками, по которым будет уже непонятно, то ли это так и должно быть, то ли опечатка... Последние в порыве отчаяния возьмут целый boost для этой задачи, а тот сведётся всё к тем же рантайм мапам и строкам.
Здесь вы найдете увлекательный процесс создания этого Франкенштейна
#гайд
🔥17👍5👏1
💥🏃 Быстрый парсинг 8-битных целых чисел
В статье приводится разбор интересной задачи: вам нужно быстро распарсить 8-битные целые числа (0, 1, 2, …, 254, 255) из строки ASCII/UTF-8. Дана строка и её длина: например, ’22’ и длина 2.
Изучить решение
#гайд
В статье приводится разбор интересной задачи: вам нужно быстро распарсить 8-битные целые числа (0, 1, 2, …, 254, 255) из строки ASCII/UTF-8. Дана строка и её длина: например, ’22’ и длина 2.
Изучить решение
#гайд
👍21👏3🌚2
⚙️🛠️ Оптимизируя неоптимизируемое: ускорение компиляции C++
В статье речь пойдёт о повышении скорости компиляции библиотеки {fmt} до уровня библиотеки ввода-вывода Cи stdio.
{fmt} — это популярная открытая библиотека С++, представляющая более эффективную альтернативу С++ библиотеке iostreams и библиотеке Си stdio. Последнюю она обошла по целому ряду аспектов:
🔹 Безопасность типов с проверками форматирующих строк во время компиляции. Эти проверки включены по умолчанию начиная с С++ 20, и присутствуют в качестве дополнения для С++ 14/17. Форматирующие строки среды выполнения в {fmt} также оказываются безопасными, чего невозможно достичь в printf.
🔹 Расширяемость. Определяемый пользователем тип можно сделать форматируемым. При этом большинство типов стандартных библиотек, например, контейнеры и пакеты для обработки даты и времени, предлагают возможность форматирования изначально.
🔹 Производительность. {fmt} намного быстрее любой распространённой реализации printf, порой на несколько порядков (например, в форматировании чисел с плавающей запятой).
🔹 Возможность переноса поддержки Unicode.
Продолжение здесь
#гайд
В статье речь пойдёт о повышении скорости компиляции библиотеки {fmt} до уровня библиотеки ввода-вывода Cи stdio.
{fmt} — это популярная открытая библиотека С++, представляющая более эффективную альтернативу С++ библиотеке iostreams и библиотеке Си stdio. Последнюю она обошла по целому ряду аспектов:
🔹 Безопасность типов с проверками форматирующих строк во время компиляции. Эти проверки включены по умолчанию начиная с С++ 20, и присутствуют в качестве дополнения для С++ 14/17. Форматирующие строки среды выполнения в {fmt} также оказываются безопасными, чего невозможно достичь в printf.
🔹 Расширяемость. Определяемый пользователем тип можно сделать форматируемым. При этом большинство типов стандартных библиотек, например, контейнеры и пакеты для обработки даты и времени, предлагают возможность форматирования изначально.
🔹 Производительность. {fmt} намного быстрее любой распространённой реализации printf, порой на несколько порядков (например, в форматировании чисел с плавающей запятой).
🔹 Возможность переноса поддержки Unicode.
Продолжение здесь
#гайд
👍12❤1🥰1🌚1
😱🤓 Неожиданное взаимодействие предсказания ветвлений и подсистем памяти
Статья посвящена оптимизации подсистем памяти.
В ней про взаимодействие механизма предсказания ветвлений с подсистемой памяти.
Схема предсказания переходов (ветвлений) является частью многих современных процессоров и используется для ускорения вычислений, когда у процессора недостаточно данных для продолжения работы. По сути, согласно ей процессор пытается спрогнозировать результат выполнения условной ветки кода до его фактического вычисления. Это событие называется спекуляцией в отношении результата ветвления, и последующие инструкции выполняются спекулятивно, то есть в случае ошибочного прогноза их результаты будут отменены.
Далее вас ждут примеры и подробный разбор
#гайд
Статья посвящена оптимизации подсистем памяти.
В ней про взаимодействие механизма предсказания ветвлений с подсистемой памяти.
Схема предсказания переходов (ветвлений) является частью многих современных процессоров и используется для ускорения вычислений, когда у процессора недостаточно данных для продолжения работы. По сути, согласно ей процессор пытается спрогнозировать результат выполнения условной ветки кода до его фактического вычисления. Это событие называется спекуляцией в отношении результата ветвления, и последующие инструкции выполняются спекулятивно, то есть в случае ошибочного прогноза их результаты будут отменены.
Далее вас ждут примеры и подробный разбор
#гайд
👍3🥰1