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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
Download Telegram
🏠 How to: Как правильно реализовать оператор присваивания

Перегрузка operator= - одна из самых коварных тем в C++. Часто приводит к багам.


🍴Правила безопасного operator=:

1️⃣ Проверяем самоприсваивание
2️⃣ Создаём временную копию
3️⃣ Используем swap idiom


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
2🥰1
Чек-лист: Оптимизация времени компиляции

Долгая компиляция убивает продуктивность. Ускорьте сборку вашего 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++ разработчика #буст
5🔥4
🚀 C++17: structured bindings

Structured bindings в C++17 — это не просто красивый синтаксис, это читаемость кода на новом уровне!


// Старый способ (до C++17)
std::map<std::string, int> counts;
for (auto it = counts.begin(); it != counts.end(); ++it) {
std::cout << it->first << ": " << it->second << std::endl;
}

// C++17 structured bindings
for (const auto& [key, value] : counts) {
std::cout << key << ": " << value << std::endl;
}

// Работает с парами, tuple, массивами
auto [x, y, z] = std::make_tuple(1, 2.5f, "hello");
auto [min, max] = std::minmax({5, 2, 8, 1, 9});



Код стал намного читаемее. Особенно полезно при работе с контейнерами пар и функциями, возвращающими несколько значений.


🧠 Используете ли вы structured bindings? В каких случаях они наиболее полезны?

Библиотека C/C++ разработчика #междусобойчик
👍4🔥2