Перегрузка
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
❤2🥰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++ разработчика #буст
❤5🔥4
🚀 C++17: structured bindings
Structured bindings в C++17 — это не просто красивый синтаксис, это читаемость кода на новом уровне!
Код стал намного читаемее. Особенно полезно при работе с контейнерами пар и функциями, возвращающими несколько значений.
🧠 Используете ли вы structured bindings? В каких случаях они наиболее полезны?
Библиотека C/C++ разработчика #междусобойчик
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