std::vector<std::vector<int> >
с пробелом? Давайте посмотрим, как изменилась работа с типами за 25 лет!//Verbosity nightmare
std::vector<std::pair<std::string, int> > vec; // пробел обязателен!
for (std::vector<std::pair<std::string, int> >::iterator it = vec.begin();
it != vec.end(); ++it) {
// работаем с *it
}
// auto и range-based for
std::vector<std::pair<std::string, int>> vec; // >> теперь OK!
for (auto& item : vec) {
// намного чище!
}
// Не нужно указывать типы
std::vector vec{std::pair{"hello", 42}, {"world", 24}}; // CTAD!
std::optional opt = some_function(); // тип выводится автоматически
// Structured bindings
for (auto [name, value] : vec) {
std::cout << name << ": " << value << "\n";
}
#include <concepts>
template<std::integral T> // Концепты!
auto process(T value) {
return value * 2;
}
// Abbreviated function templates
auto add(std::integral auto a, std::integral auto b) {
return a + b;
}
// if consteval для compile-time проверок
constexpr auto get_value() {
if consteval {
return 42; // compile-time версия
} else {
return expensive_runtime_calc(); // runtime версия
}
}
// Multidimensional subscript operator
matrix[1, 2, 3] = value; // вместо matrix[1][2][3]
Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤2
🔹 Зачем?
Работа с перечислениями (enum) в C++ часто требует дополнительного кода: преобразование в строку, проверка значений, итерация по всем вариантам. Библиотека conjure_enum автоматизирует эту рутину!
🔹 Что умеет?
✅ Генерация to_string() для enum
✅ Проверка валидности значений (is_valid)
✅ Итерация по всем элементам enum
✅ Поддержка enum и enum class
✅ Минимальный оверхед (всё вычисляется на этапе компиляции)
🔹 Пример использования:
#include "conjure_enum.h"
CONJURE_DEFINE_ENUM(Color, Red, Green, Blue)
int main() {
Color c = Color::Green;
std::cout << conjure_enum::to_string(c); // "Green"
std::cout << conjure_enum::is_valid(42); // false
for (Color value : conjure_enum::values<Color>()) { ... }
}
🔹 Плюсы:
✔️ Заголовочный-only (просто подключи conjure_enum.h)
✔️ Не требует C++20 (работает даже на C++11)
✔️ Лёгкая интеграция в существующий код
💡 Кому пригодится?
— Тем, кто устал писать switch-case для enum-ов
— Если нужна удобная отладка (вывод значений в лог)
— Для валидации конфигов/сетевых данных
🔗 Ссылка
Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤1
Перегрузка
operator= -
одна из самых коварных тем в C++. Часто приводит к багам.class MyString {
private:
char* data;
size_t length;
public:
// Правильный operator=
MyString& operator=(const MyString& other) {
if (this == &other) return *this; // самоприсваивание
// Создаём временную копию
char* temp = new char[other.length + 1];
strcpy(temp, other.data);
// Освобождаем старые данные
delete[] data;
// Присваиваем новые
data = temp;
length = other.length;
return *this;
}
// Лучше через copy-and-swap
MyString& operator=(MyString other) { // копия по значению
swap(*this, other);
return *this;
}
};
Без проверки самоприсваивания можем удалить данные, которые копируем.
Copy-and-swap никогда не подведёт.
Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🥰1
✅ Чек-лист: Оптимизация времени компиляции
Долгая компиляция убивает продуктивность. Ускорьте сборку вашего C++ проекта.
🎯 Структура проекта
✓ Используйте forward declarations вместо
✓ Минимизируйте зависимости в header файлах
✓ Применяйте
✓ Разбивайте большие файлы на модули
🎯 Современные возможности
✓ Переходите на C++20 modules постепенно
✓ Используйте precompiled headers для стабильных зависимостей
✓ Настройте distributed compilation (distcc, Incredibuild)
🎯 Инструменты и настройки
✓ Включите параллельную компиляцию (-j флаг)
✓ Используйте ccache для кеширования результатов
✓ Профилируйте время компиляции с -ftime-trace (Clang)
✓ Настройте incremental linking
Как измерить результат: Замеряйте время полной и инкрементальной сборки регулярно.
Библиотека C/C++ разработчика #буст
Долгая компиляция убивает продуктивность. Ускорьте сборку вашего C++ проекта.
🎯 Структура проекта
✓ Используйте forward declarations вместо
#include
где возможно✓ Минимизируйте зависимости в header файлах
✓ Применяйте
Pimpl idiom
для скрытия деталей имплементации✓ Разбивайте большие файлы на модули
🎯 Современные возможности
✓ Переходите на C++20 modules постепенно
✓ Используйте precompiled headers для стабильных зависимостей
✓ Настройте distributed compilation (distcc, Incredibuild)
🎯 Инструменты и настройки
✓ Включите параллельную компиляцию (-j флаг)
✓ Используйте ccache для кеширования результатов
✓ Профилируйте время компиляции с -ftime-trace (Clang)
✓ Настройте incremental linking
Как измерить результат: Замеряйте время полной и инкрементальной сборки регулярно.
Библиотека C/C++ разработчика #буст
❤6🔥5
👾 Ржавеющие плюсы: как внедрять современные проверки С++
💡Разработчик из Яндекс.Такси поделился опытом масштабного внедрения инструментов безопасности C++ — от статических анализаторов до санитайзеров.
❗️ Ключевые моменты доклада:
• внедрение CPP Hardening, Clang Lifetime Annotation и санитайзеров заняло 4 месяца
• из 40 тысяч падений тестов 20 тысяч были вызваны одной ошибкой
• санитайзеры нашли несколько сотен реальных багов в промышленной кодовой базе
Основной фокус — пятиэтапный процесс внедрения: тестирование проверок, анализ ошибок, постепенная починка багов, координация между командами и определение момента завершения работ.
Особенно актуально для компаний с большими legacy кодовыми базами, где безопасность кода критична для стабильности сервисов.
Вы узнаете, что простое включение проверок без продуманной стратегии может парализовать разработку, но правильный подход позволяет за месяц сократить количество критических ошибок с 17 тысяч до 39.
👉 Видео
Библиотека C/C++ разработчика #буст
💡Разработчик из Яндекс.Такси поделился опытом масштабного внедрения инструментов безопасности C++ — от статических анализаторов до санитайзеров.
❗️ Ключевые моменты доклада:
• внедрение CPP Hardening, Clang Lifetime Annotation и санитайзеров заняло 4 месяца
• из 40 тысяч падений тестов 20 тысяч были вызваны одной ошибкой
• санитайзеры нашли несколько сотен реальных багов в промышленной кодовой базе
Основной фокус — пятиэтапный процесс внедрения: тестирование проверок, анализ ошибок, постепенная починка багов, координация между командами и определение момента завершения работ.
Особенно актуально для компаний с большими legacy кодовыми базами, где безопасность кода критична для стабильности сервисов.
Вы узнаете, что простое включение проверок без продуманной стратегии может парализовать разработку, но правильный подход позволяет за месяц сократить количество критических ошибок с 17 тысяч до 39.
👉 Видео
Библиотека C/C++ разработчика #буст
❤4👾1
📰 Свеженькое из мира C++
Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.
😎 Полезное:
• Как правильно реализовать оператор присваивания — реализация своего оператора присваивания
• Оптимизация времени компиляции — чек-лист по улучшению времени компиляции кода
• Как внедрять современные проверки С++ — видео о подходах к внедрению инструментов безопасности
🖨Интересные проекты:
• NanaZip — архиватор файлов с открытым исходным кодом (написан на основе исходного кода исходного кода 7-Zip)
• RocksDB — постоянное хранилище ключей и значений для флэш-памяти и оперативной памяти
• Atmosphère — кастомизированная прошивка для Nintendo Switch
Библиотека C/C++ разработчика #буст
Подготовили подборку самых интересных материалов за неделю о разных аспектах программирования и интересных проектах в мире C++.
😎 Полезное:
• Как правильно реализовать оператор присваивания — реализация своего оператора присваивания
• Оптимизация времени компиляции — чек-лист по улучшению времени компиляции кода
• Как внедрять современные проверки С++ — видео о подходах к внедрению инструментов безопасности
🖨Интересные проекты:
• NanaZip — архиватор файлов с открытым исходным кодом (написан на основе исходного кода исходного кода 7-Zip)
• RocksDB — постоянное хранилище ключей и значений для флэш-памяти и оперативной памяти
• Atmosphère — кастомизированная прошивка для Nintendo Switch
Библиотека C/C++ разработчика #буст
👍2❤1
💭 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 получает режим усиленной безопасности
Разработчики
🏖️ Новый режим одной командой активирует целый набор защитных механизмов:
• Инициализация переменных нулями
• Защита стека и от переполнений
• Рандомизация адресов
• Усиленные проверки библиотек
• Дополнительные предупреждения
Проблема: разрозненность опций безопасности в C/C++. Многие разработчики просто не знают о их существовании или забывают включать.
Решение: единый флаг, который «из коробки» делает код безопаснее.
Конечно, это костыли для языков 70-80х годов, но лучше поздно чем никогда.
👉 Заметка
Библиотека C/C++ разработчика #буст
Разработчики
Clang
обсуждают добавление флага -fhardened
по аналогии с GCC 14
. 🏖️ Новый режим одной командой активирует целый набор защитных механизмов:
• Инициализация переменных нулями
• Защита стека и от переполнений
• Рандомизация адресов
• Усиленные проверки библиотек
• Дополнительные предупреждения
Проблема: разрозненность опций безопасности в C/C++. Многие разработчики просто не знают о их существовании или забывают включать.
Решение: единый флаг, который «из коробки» делает код безопаснее.
Конечно, это костыли для языков 70-80х годов, но лучше поздно чем никогда.
👉 Заметка
Библиотека C/C++ разработчика #буст
Часто при написании операторов присваивания или 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
👍15❤1
Forwarded from Proglib.academy | IT-курсы
🌐 Чек-лист: как искать работу
Чтобы не застрять в вечной отладке своей карьеры, держим в голове (и перед глазами) понятный план. Вот чек-лист на период поиска:
✅ Обновите резюме и профиль (да, и 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 #буст
Чтобы не застрять в вечной отладке своей карьеры, держим в голове (и перед глазами) понятный план. Вот чек-лист на период поиска:
Ваш профиль — это витрина. Убедитесь, что в нём отражены:
• актуальные технологии (например, .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