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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
加入频道
🍙 How-to: Как избежать memory ordering проблем в многопоточном коде


💭 Race conditions в атомарных операциях - одна из самых коварных проблем. Разбираемся с memory ordering.


✏️ Пошаговое решение:

Проблема: Неопределенное поведение при concurrent доступе

//  ОПАСНО: data race!
std::atomic<bool> ready{false};
int data = 0;

// Thread 1
data = 42;
ready.store(true); // неопределенный ordering!

// Thread 2
if (ready.load()) {
process(data); // может быть 0 или 42!
}



Решение: Explicit memory ordering

//  ПРАВИЛЬНО: используем memory_order
std::atomic<bool> ready{false};
int data = 0;

// Thread 1
data = 42;
ready.store(true, std::memory_order_release); // освобождаем

// Thread 2
if (ready.load(std::memory_order_acquire)) { // захватываем
process(data); // гарантированно 42!
}


⚠️ Частые ошибки:

• Использование memory_order_relaxed везде
• Забывание про acquire-release семантику
• Смешивание атомарных и неатомарных операций

Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5👍2
👾 Clang получает режим усиленной безопасности

Разработчики Clang обсуждают добавление флага -fhardened по аналогии с GCC 14.

🏖️ Новый режим одной командой активирует целый набор защитных механизмов:

• Инициализация переменных нулями
• Защита стека и от переполнений
• Рандомизация адресов
• Усиленные проверки библиотек
• Дополнительные предупреждения

Проблема: разрозненность опций безопасности в C/C++. Многие разработчики просто не знают о их существовании или забывают включать.

Решение: единый флаг, который «из коробки» делает код безопаснее.
Конечно, это костыли для языков 70-80х годов, но лучше поздно чем никогда.

👉 Заметка

Библиотека C/C++ разработчика #буст
💡 Фича дня: std::exchange (C++14)

Часто при написании операторов присваивания или swap-функций приходится сохранять старое значение, заменяя его новым. Код получается многословным и подверженным ошибкам.

std::exchange атомарно заменяет значение переменной и возвращает старое значение — всё в одной строке.


До:

T old_value = obj;
obj = new_value;
return old_value;


После:

return std::exchange(obj, new_value);


Код становится более читаемым, безопасным и выразительным. Особенно полезно в RAII-классах и при работе с умными указателями.

Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍151
🌐 Чек-лист: как искать работу

Чтобы не застрять в вечной отладке своей карьеры, держим в голове (и перед глазами) понятный план. Вот чек-лист на период поиска:

Обновите резюме и профиль (да, и GitHub тоже)

Ваш профиль — это витрина. Убедитесь, что в нём отражены:
• актуальные технологии (например, .NET 6/7/8, Blazor, ASP.NET, Azure и т. д.).
• понятные результаты («реализовал систему логирования» , а не «писал код»).
• ссылки на GitHub с чистыми, осмысленными проектами — лишнее желательно скрыть или удалить.

Сформулируйте ключевые навыки и корректные поисковые запросы.

Большинство рекрутеров используют автоматические фильтры. Включите в резюме чёткие названия технологий: Entity Framework Core, LINQ, RabbitMQ, Docker, CI/CD, Kubernetes.

Следите за вакансиями регулярно, но без стресса

• Настройте уведомления на LinkedIn, Habr Career, hh.
• Подпишитесь на каналы с вакансиями, например, наш канал с вакансиями для шарпистов.

Готовьтесь к собеседованиям заранее

• Освежите базовые концепции вроде async/await, Dependency Injection, SOLID, разберитесь в нюансах работы ASP.NET.
• Подумайте заранее, какие проекты вы можете описать как удачные кейсы.
• Поработайте над формулировками, которые показывают ваш вклад — рекрутеры ценят конкретику.

Сколько ищете работу? Пару дней или пару месяцев? Пишите в комментарии👇

Proglib Academy #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🧨 Range views: детали реализации, неочевидное поведение и влияние на производительность

Современные диапазоны могут заменить 90% ваших циклов — но есть подводные камни.

Разработчик из Яндекса разобрал детали реализации ranges, которые изменят ваш подход к обработке данных:

Композируемость алгоритмов — строите цепочки операций через pipe operator вместо вложенных циклов
Ленивые вычисления — всё выполняется за один проход, экономя память и время
Скрытое кэширование — почему константные объекты могут не компилироваться и как это обойти
Проблемы с join и split — когда повторная итерация приводит к неопределённому поведению
Оптимизация производительности — тесты показывают эквивалентность с ручным кодом
Практические ловушкиdouble calls, broken constness и другие неочевидные эффекты

📹 Видео

Библиотека C/C++ разработчика #буст
3
📰 Свеженькое из мира C++

Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.

😼 Интересное:

Clang получает режим усиленной безопасности — добавление в Clang нового флага безопасности
Range views — детали реализации, неочевидное поведение и влияние на производительность
Сколько ты стоишь как разработчик — статья о том как оценить свою стоимость на рынке

😎 Полезное:

Как избежать memory ordering проблем в многопоточном коде — полезные советы по улучшению многопоточного кода
std::exchange — современный способ обмена значениями

🖨️Интересные проекты:

Solidity — язык высокого уровня для реализации смарт-контрактов
Flameshot — мощное, но простое в использовании программное обеспечение для создания снимков экрана
Eclipse SUMO — пакет для моделирования дорожного движения с открытым исходным кодом

Библиотека C/C++ разработчика #буст
🥳 How to: RAII + Custom Deleters для ресурсов

Если нужно управлять сложными ресурсами, то можно воспользоваться костюмными deleters.

‼️ Проблема:

FILE*, сокеты, OpenGL объекты требуют специального освобождения

✏️ Решение:


// Универсальный RAII wrapper

template<typename T, typename Deleter>
class Resource {
T resource;
Deleter deleter;
bool owns_resource = true;
public:
Resource(T resource, Deleter deleter) : resource(resource)
, deleter(deleter) {}

~Resource() { if(owns_resource) deleter(resource); }

Resource(Resource&& other) : resource(other.resource)
, deleter(std::move(other.deleter))
, owns_resource(other.owns_resource)
{ other.owns_resource = false; }

Resource(const Resource&) = delete;
T get() const { return resource; }
T release() { owns_resource = false; return resource; }
};


// Использование
auto file = Resource(fopen("data.txt", "r"),
[](FILE* f) { if(f) fclose(f); });


🍪 Совет:

Для совместимости с STL удобно использовать std::unique_ptr с кастомным deleter.


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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14🥰3
🥳 Как быстро разобраться в чужом C++ коде?

Попали в новый проект и видите море незнакомого C++ кода? Не тратьте часы на разбор каждой строчки.


✏️ Лайфхак для разработчиков

Используйте простой, но эффективный промпт для ИИ-помощника:

Context: I'm starting a new position as backend developer and I have to start to understand how some functions are working

Technologies: C++, [добавьте ваши технологии: STL, Boost, Qt и т.д.]

You have to: explain me the code line by line

[ВСТАВЬТЕ ВАШ КОД СЮДА]



⬆️ Особенно полезно для:

• Сложных template-конструкций
• Многопоточного кода с std::thread
• Низкоуровневых операций с памятью
• RAII и smart pointers
• STL алгоритмов и контейнеров


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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
😁85
🔥 Hotkey boost: Автоматическая синхронизация и применение изменений CMake


🐊 Проблема:

При изменении CMakeLists.txt нужно вручную запускать переконфигурацию проекта, что отвлекает от основной работы.


💡 Решение:

Автоматическая синхронизация и мгновенное применение изменений CMake.


Работает в:

• CLion: автоматически или Ctrl+Shift+A → "Reload CMake Project"
• VSCode (с CMake Tools): F7 или через командную панель
• Visual Studio: соответствующая кнопка в CMake панели

✏️ Настройка в CLion:

• Перейдите в Settings → Build, Execution, Deployment → CMake
• Включите опцию "Reload CMake project on editing CMakeLists.txt files"
• Теперь при любом изменении CMakeLists.txt проект будет автоматически реконфигурироваться!

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🐸 Оптимизация копирования с помощью техники Zero-Copy


🔥 Проблема:

При передаче больших объемов данных между процессами или в сетевых операциях происходит множественное копирование данных в память, что создает узкие места по производительности. Особенно критично в высоконагруженных системах реального времени.


✏️ Решение:

Zero-Copy позволяет передавать данные без копирования в пользовательское пространство, используя системные вызовы sendfile() и splice() в Linux.

#include <sys/sendfile.h>
#include <fcntl.h>

// Отправка файла через сокет без копирования в userspace
int send_file_zerocopy(int socket_fd, const char* filename) {
int file_fd = open(filename, O_RDONLY);
off_t offset = 0;
struct stat file_stat;

fstat(file_fd, &file_stat);
// Прямая передача из ядра в сокет
ssize_t sent = sendfile(socket_fd, file_fd, &offset, file_stat.st_size);

close(file_fd);
return sent;
}



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

• Снижение использования CPU при передаче данных
• Уменьшение задержек за счет исключения системных вызовов copy
• Экономия памяти — данные не загружаются в пользовательское пространство
• Масштабируемость для высоконагруженных веб-серверов и прокси


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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍71
😎 std::mdspan в C++23: многомерные данные без самодельных view

💡 В C++23 появился std::mdspan — стандартизованный способ адресации многомерных данных без самодельных обвязок на указателях и макросах.

Ключевые возможности mdspan:
• настраиваемые политики размещения (row-major, column-major, stride)
• статические и динамические размерности в типе
• транспонирование и ROI без копирования данных

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

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

Теперь вместо ручной арифметики указателей у вас единый тип и возможность писать универсальные функции без привязки к внутренней формуле offset'а.

👉 Статья

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

#буст
🔥3👍1
🔥О реальной ситуации на рынке junior-разработчиков: почему сейчас лучшее время для входа в IT

«Джунов много, а вакансий мало... Невозможно найти первую работу!» — такие комментарии часто встречаются в IT-сообществах


💡 Сергей Попов, директор образовательного продукта в Скиллбокс и ментор в Хекслите, развенчивает мифы о рынке junior-специалистов.

Ключевые моменты интервью:

• в России не хватает 750 тысяч IT-специалистов по данным Минцифры
• зарплаты стажёров составляют 40-50 тысяч рублей с перспективой роста
• каждая крупная компания запускает собственные стажировочные программы

Основной фокус — реальные возможности для входа в IT через стажировки, корпоративные университеты и различные образовательные треки от крупных компаний.

Главный инсайт: конкуренция среди джунов действительно высока, но компании активно борются за кадры, создавая всё больше возможностей для новичков. Ключ к успеху — правильно подобрать формат обучения

👉 Видео

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

#буст
😁8🥱31🔥1
🍪 Профилирование с perf

Perf — мощный профайлер для Linux, который поможет найти узкие места в вашем C++ коде.


✏️ Основные команды:
# Запись профиля
perf record ./your_program

# Просмотр результатов
perf report

# Профилирование по CPU
perf stat ./your_program

# Анализ кэш-промахов
perf stat -e cache-misses ./your_program



‼️ Что можно анализировать:

• Время выполнения функций
• Cache misses
• Branch mispredictions
• Memory bandwidth


🍬 Методичка по использованию perf

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍2🤩1
🍿 How to: Structured Bindings: распаковка данных (C++17)

Элегантная работа с multiple return values и сложными структурами.

#include <map>
#include <tuple>
#include <array>

// Функция возвращает несколько значений
std::tuple<int, std::string, double> get_data() {
return {42, "hello", 3.14};
}

struct Point { int x, y; };

int main() {
// 1. Распаковка tuple
auto [id, name, price] = get_data();
std::cout << id << " " << name << " " << price << "\n";

// 2. Распаковка struct
Point p{10, 20};
auto [x, y] = p;
std::cout << "Point: " << x << ", " << y << "\n";

// 3. Распаковка array
std::array<int, 3> arr{1, 2, 3};
auto [first, second, third] = arr;

// 4. Распаковка map::insert результата
std::map<std::string, int> m;
auto [iterator, inserted] = m.insert({"key", 42});
if (inserted) {
std::cout << "Inserted: " << iterator->first << "\n";
}

// 5. Итерация по map с распаковкой
for (const auto& [key, value] : m) {
std::cout << key << " -> " << value << "\n";
}

// 6. Распаковка с модификаторами
auto& [rx, ry] = p; // Ссылки на члены
rx = 100; // Изменяем оригинал
}


💡 Применения:

Более читаемый код при работе с парами, tuple, структурами


✏️ А как вы распаковываете данные? Пишите в комментариях.

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍2
⚡️ Constexpr эволюция — от C++11 до C++23

Хотите больше вычислений во время компиляции для максимальной производительности?

constexpr развивался от простых функций в C++11 до полноценного compile-time программирования в C++20. Позволяет выполнять сложную логику на этапе компиляции.


💡 C++11 — только простые функции:

constexpr int factorial(int n) {
return n <= 1 ? 1 : n * factorial(n - 1);
}



💡 C++14 — циклы и условия:

constexpr int sum_array(const int* arr, size_t size) {
int sum = 0;
for (size_t i = 0; i < size; ++i) {
sum += arr[i];
}
return sum;
}



💡 C++20 — std::vector и dynamic memory:

constexpr std::vector<int> make_sequence(int n) {
std::vector<int> result;
for (int i = 0; i < n; ++i) {
result.push_back(i * i);
}
return result;
}



💡 C++23 — constexpr std::string:

constexpr std::string process_text() {
std::string result = "Hello, ";
result += "constexpr world!";
return result;
}

constexpr auto text = process_text(); // Во время компиляции!



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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥133👍3
👾 Скрытые ловушки встроенной сборки в C++

В видео разбирается фундаментальная проблема несовместимости моделей параллелизма C++ (RC11) и x86, возникающая при использовании встроенной сборки.

Ключевые моменты доклада:

• невременные хранилища (non-temporal stores) обходят кэш и нарушают синхронизацию acquire-release
• стандартные режимы доступа RC11 не могут корректно моделировать встроенную сборку
• предлагается расширение модели с тремя новыми режимами доступа: TSO, non-temporal и store fence

Основной фокус — разработка семантики, которая позволяет корректно совмещать высокоуровневые конструкции C++ с низкоуровневыми инструкциями x86 в одной программе.

Вы поймёте, почему простое добавление inline assembly может привести к data race и нарушению корректности многопоточной программы, даже если код выглядит безопасным с точки зрения модели памяти C++.

👉 Видео

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

#буст
🔥2😁1