Библиотека C/C++ разработчика | cpp, boost, qt
20.4K subscribers
1.75K photos
46 videos
16 files
3.93K links
Все самое полезное для плюсовика и сишника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/d6cd2932

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
Download Telegram
😱🤦‍♂️ Опечатки, нулевые указатели и коварный таб: 33 фрагмента в библиотеке GTK

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()).

Продолжение истории вот

#гайд
👍17
🧑‍💻 Обработка строковых литералов во время компиляции

С момента добавления constexpr можно многое делать во время компиляции. Одной из таких вещей является обработка строковых литералов.

Поиск строк в бинарнике

Если вы объявите переменную типа const char* str = «Hello World»;, строка «Hello World» будет в бинарнике.

В Linux, macOS и Windows есть команда strings. (для Windows необходимо установить Sysinternals Suite)

Запуск strings [your_binary] выведет список всех строк — «Hello World» должен быть среди них.

Далее примеры кода и несколько фишек

#гайд
👍82🔥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 (для удобной, единообразной работы с настройками приложения)

Далее подробное описание процесса и куча кода

#гайд
5👍2🔥1👏1
🎯✏️ Реализация #embed для C и C++

Речь пойдет о реализации директивы бинарного включения данных в gcc и clang для C и C++.

Автор опишет способ, которым реализовал #embed для GCC и Clang, и стиль работы, который использовал для ранней версии #embed. Будет использоваться общедоступная версия #embed, которая предложена Clang, в качестве инструмента для отображения одного из используемых методов, позволяющих получить гарантированное ускорение для подмножества случаев, которые имеют значение (например, инициализация массива char/signed char/unsigned char).

Изучить материал

#гайд
🔥4👏2👍1
🫡 💩 Для обработки строк потоки в C++ могут быть медленными

Потоки могут быть на удивление медленными. Например, если вы хотите анализировать числа, то эта процедура 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
👍30🤩191🔥1🥱1
🧑‍🔬🏥 CLI'нический парсинг

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

Здесь вы найдете увлекательный процесс создания этого Франкенштейна

#гайд
🔥17👍5👏1
💥🏃 Быстрый парсинг 8-битных целых чисел

В статье приводится разбор интересной задачи: вам нужно быстро распарсить 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.

Продолжение здесь

#гайд
👍121🥰1🌚1
😱🤓 Неожиданное взаимодействие предсказания ветвлений и подсистем памяти

Статья посвящена оптимизации подсистем памяти.

В ней про взаимодействие механизма предсказания ветвлений с подсистемой памяти.

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

Далее вас ждут примеры и подробный разбор

#гайд
👍3🥰1