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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
Download Telegram
🍬 Чек-лист: Allocators — контроль над памятью

STL позволяет полностью контролировать аллокацию памяти через allocators.


✏️ Зачем нужны:

✓ Pool allocators для объектов одного размера (быстрее malloc)
✓ Stack allocators для временных данных без обращения к куче
✓ Tracking allocators для профилирования утечек памяти
✓ Aligned allocators для SIMD-оптимизированных структур


✏️ Стандартные allocators:

✓ std::allocator — дефолтный, работает через new/delete
✓ std::pmr::monotonic_buffer_resource — аллокация из буфера
✓ std::pmr::unsynchronized_pool_resource для многократного переиспользования
✓ std::pmr::polymorphic_allocator для динамической смены стратегии


✏️ Создание кастомного:

✓ Реализуй allocate() и deallocate()
✓ Объяви value_type, size_type, difference_type
✓ Не забудь про rebind для типов внутри контейнера
✓ Сделай allocator stateless для оптимизаций


💡Как измерить результат:

Сравни количество malloc-вызовов через profiler до и после внедрения кастомного allocator. Цель — уменьшить на 50%+.


🍪 Факт:

В game dev кастомные allocators — стандарт. Они значительно ускоряют аллокацию по сравнению с malloc.

Библиотека C/C++ разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
🍴 Assert vs If: когда проверки только вредят

Часто в коде встречаются избыточные проверки, которые защищают от "невозможных" ситуаций:

void process(Config* config) {
if (config == nullptr) { // хотя config всегда валиден!
log_error("Config is null");
return;
}
// ...
}


❗️Проблема: такие if загромождают код, снижают производительность и создают иллюзию безопасности.

Решение: использовать assert для проверки инвариантов — условий, которые всегда должны выполняться в корректной программе:

void process(Config* config) {
assert(config != nullptr && "Config cannot be null");
// ...
}


💡 Почему это лучше:

• В релизе (NDEBUG) код assert полностью удаляется — нет накладных расходов
• В горячих циклах это может означать миллионы сэкономленных проверок
• Меньше размер исполняемого файла
• assert явно документирует предусловия функции
• Баг обнаруживается сразу в Debug, а не прячется за логами


👉 Статья


Библиотека C/C++ разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🤔31🥱1👾1
🔥 Highlight — must-have расширение для VS Code

Если надоело искать TODO и FIXME в коде, то расширение Highlight превратит их в яркие цветные метки, которые невозможно пропустить.

😎 Что умеет:

• Подсвечивает TODO, FIXME, NOTE, HACK и другие маркеры прямо в коде
• Настраиваемые цвета и стили для каждого типа комментариев
• Поддерживает кастомные регулярки для своих меток
• Работает со всеми языками, включая C++

✍️ Пример использования:

// TODO: оптимизировать этот алгоритм
// FIXME: утечка памяти здесь
// NOTE: важное замечание про thread-safety


Все эти комментарии будут выделены разными цветами — красным для FIXME, жёлтым для TODO и т.д.

❗️Особенно полезно в больших проектах, где легко забыть о временных хаках. Устанавливается в пару кликов, настраивается через settings.json.

👉 Ссылка на расширение

Библиотека C/C++ разработчика

#буст
6👍4❤‍🔥1
✏️ Потокобезопасная инициализация через std::call_once

Инициализация ресурсов в многопоточном приложении — классическая головная боль. std::call_once решает эту проблему элегантно: гарантирует вызов функции ровно один раз, даже если несколько потоков пытаются сделать это одновременно. Забудьте про ручные мьютексы и double-checked locking с их подводными камнями.

#include <mutex>
#include <memory>
#include <iostream>

class DatabaseConnection {
public:
static DatabaseConnection& getInstance() {
// std::call_once гарантирует однократный вызов лямбды
// даже при конкурентном доступе из разных потоков
std::call_once(initFlag, []() {
instance.reset(new DatabaseConnection());
std::cout << "Database initialized\n";
});
return *instance;
}

void query(const std::string& sql) {
std::cout << "Executing: " << sql << "\n";
}

// Запрещаем копирование и перемещение
DatabaseConnection(const DatabaseConnection&) = delete;
DatabaseConnection& operator=(const DatabaseConnection&) = delete;

private:
DatabaseConnection() {
// Тяжелая инициализация: подключение к БД,
// загрузка конфигурации и т.д.
}

static std::once_flag initFlag; // Флаг для call_once
static std::unique_ptr<DatabaseConnection> instance;
};

// Определение статических членов
std::once_flag DatabaseConnection::initFlag;
std::unique_ptr<DatabaseConnection> DatabaseConnection::instance;



‼️ Ключевые особенности:

Потокобезопасность из коробки — не нужен ручной mutex, std::call_once сам блокирует конкурентные вызовы
Без накладных расходов после первого вызова — последующие вызовы проверяют только атомарный флаг
Исключения не ломают логику — если инициализация бросила exception, флаг не устанавливается и следующий поток попробует снова
Работает с любыми callable — лямбды, функции, функторы, std::bind


Используете std::call_once в продакшене? Какие кейсы у вас?

Библиотека C/C++ разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6😁1
⚙️ Новый релиз OpenMW 0.50.0: улучшенная поддержка геймпадов и интерфейс

Разработчики игрового движка OpenMW, реимплементированного движка для Morrowind с открытым исходным кодом, выпустили долгожданную версию 0.50.0. Это масштабное обновление, ориентированное на повышение удобства игры на современных платформах, включая портативные устройства вроде Steam Deck. Особое внимание уделено улучшенной поддержке геймпадов и новому интерфейсу, специально адаптированному под управление контроллерами.

Основные изменения:

• Значительное улучшение навигации с геймпадом
• Исправления интерфейса и механики игры
• Оптимизация для портативных устройств и современных разрешений
• Продолжение работы над совместимостью и стабильностью

Это обновление открывает новые возможности для тех, кто любит играть в Morrowind на современном оборудовании, делая процесс более комфортным и интуитивным.

👉 Gitlab
👉 Заметки по релизу

Библиотека C/C++ разработчика

#буст
4😁1
⚠️ «Гибкий график» и «возможность профессионального роста»: что работодатели на самом деле имеют в виду

«Стартап-атмосфера» = хаос и переработки, «возможность профессионального роста» = будете работать за четверых. Составили словарь корпоративного новояза и список неудобных вопросов, которые стоит задать на собеседовании, чтобы не попасть в ловушку.

🔗 Читать статью

🏃‍♀️ Proglib Academy

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7👍4
🔥 Опасная ловушка в C++ модулях

Работаете с модулями в C++20/23? Осторожно: один символ может превратить ваш код в некорректный, но компилятор может об этом промолчать.

Представьте: вы создаёте module unit для модуля A и случайно пишете import A; вместо module A;. Казалось бы, очевидная ошибка. Но если вы используете MSVC — код скомпилируется, слинкуется и запустится без единого предупреждения.

В чём подвох? При использовании module A; ваша реализация функции корректно прикрепляется к модулю A. Но когда вы пишете import A;, функция попадает в глобальный модуль, который содержит все имена, не привязанные к конкретным модулям. Технически это конфликт: функция уже экспортирована из модуля A, а вы пытаетесь определить её заново в глобальном пространстве.

GCC 15 честно выдаст ошибку: «redeclaring in global module conflicts with import». А вот MSVC спокойно пропустит такой код, оставляя вас с программой, которая работает, но формально нарушает стандарт. Это классический пример того, как тонкости модулей могут стать источником неочевидных багов при переносе кода между компиляторами.

Сталкивались ли вы с неожиданным поведением модулей? Какие компиляторы используете для работы с C++20/23?

👉 Заметка

Библиотека C/C++ разработчика

#буст
👍5😢31
🎲 Ueli: лаунчер для продуктивных разработчиков

Ueli — это инструмент быстрого запуска приложений, файлов, папок и веб‑сайтов с помощью клавиатурных сокращений. По сути, это «умный поиск» по вашей системе с массой полезных фишек для разработчиков.

😎 Ключевые возможности:

Мгновенный запуск приложений: наберите пару букв — и нужное ПО уже открыто
Поиск файлов и папок: быстро находите любые документы по имени
• Веб‑поиск: введите запрос — и Ueli откроет его в браузере
• Калькулятор: встроенные вычисления прямо в строке поиска
• Поддержка плагинов: расширяйте функционал под свои нужды
• Настройка внешнего вида: меняйте темы, шрифты, прозрачность

👉 Сайт

Есть опыт работы с Ueli? Как вы ускоряете свою работу?

#буст

Библиотека C/C++ разработчика
👍3
🏢 Булевый поиск: как находить «спрятанные» вакансии в LinkedIn, GitHub и Google

В этой статье мы расскажем, как с помощью булевого поиска можно искать
вакансии на LinkedIn и hh.ru (обходя кривые фильтры); на GitHub, где
компании и эйчары выкладывают позиции в репозиториях и issues; а также
через Google, находя карьерные страницы компаний, которые плохо
индексируются.

Библиотека C/C++ разработчика

#буст
👍1🔥1
🍴 XTML: минималистичный C++‑движок для HTML‑шаблонов

XTML — утилита написанная на C++, предназначенная для обработки шаблонных файлов и генерации динамического HTML.


💡 Ключевые фичи:

Переменные и плейсхолдеры: определяйте переменные и вставляйте их через {{@varName}}
Условная логика и циклы: поддерживаются if, else, while для динамической генерации
Вычисление выражений: математика, строковые операции, работа с массивами
Функции и модули: определяйте функции в шаблонах или расширяйте через C++ DLL

HTML в выражениях: можно генерировать HTML прямо из вычисляемых выражений


❗️Пример:

Шаблон:
<xtml>
var title = "XTML Example Page";
var a = 15;
var b = 7;
var comparison = expr {
if (a > b) {
print("a is greater than b");
}
else {
print("a is not greater than b");
}
};
</xtml>

<html>
<head>
<title>{{@title}}</title>
</head>
<body>
<p>{{@comparison}}</p>
</body>
</html>


Сборка и вывод:
xtml build template.xtml


<html>
<head>
<title>XTML Example Page</title>
</head>
<body>
<p>a is greater than b</p>
</body>
</html>



✏️ Github


Библиотека C/C++ разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2