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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
Download Telegram
🍿 std::partition — Разделение данных по условию

🔥 Проблема:

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


💡Решение:

Алгоритм std::partition переупорядочивает элементы так, что все удовлетворяющие предикату оказываются в начале. Возвращает итератор на границу разделения.


✏️ Пример кода:

#include <algorithm>
#include <vector>

std::vector<int> numbers = {1, 5, 2, 8, 3, 9, 4, 7, 6};

// Разделяем на четные и нечетные
auto boundary = std::partition(numbers.begin(), numbers.end(),
[](int n) {
return n % 2 == 0; // Четные в начало
}
);

// Теперь numbers = {6, 4, 2, 8, 3, 9, 5, 7, 1}
// boundary указывает на первый нечетный элемент

// Обрабатываем только четные числа
for (auto it = numbers.begin(); it != boundary; ++it) {
*it *= 2; // Удваиваем четные
}



🍨 Преимущества:

• Эффективность: работает in-place без дополнительной памяти O(1)
• Скорость: линейная сложность O(n) за один проход
• Стабильность: существует std::stable_partition для сохранения порядка
• Универсальность: подходит для любых типов данных с произвольным предикатом


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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍51
🍖 Как сократить бинарный код и не потерять нужную функциональность

В статье подробно показывают, как оптимизировать бинарный код C++-проекта, чтобы не потерять нужную функциональность, используя только сборочные флаги, правильную работу с шаблонами и альтернативы стандартным инструментам.

📕 Ключевые моменты статьи:

• грамотное применение флагов компилятора и линковки для сокращения бинаря
• замена std::visit и std::variant на более экономичные паттерны
• уход от std::shared_ptr к unique_ptr ради уменьшения инстанциаций и поддержки чисто-сырого владения

Основной фокус — практические сценарии уменьшения итогового бинарного файла: что реально помогает, а от чего лучше отказаться, если не хотите усложнять архитектуру, ломать исключения и убирать RTTI.

👉 Статья

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

#буст
👍1
🍬 Чек-лист: 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
👍3🔥2