1.9Kпросмотров
53.2%от подписчиков
6 января 2026 г.
statsScore: 2.1K
✂️ C++17: Перестаньте копировать строки! (std::string_view) Мы привыкли передавать строки в функции по константной ссылке: const std::string&. Нам кажется, что это эффективно, ведь мы не копируем объект, верно? Не всегда. 🛑 Если вы передаете в такую функцию обычный текст в кавычках (строковый литерал) или часть другой строки, C++ втайне от вас создаст временный объект std::string, выделит память в куче (heap allocation), скопирует туда данные и только потом передаст ссылку. Решение? std::string_view. 👀 Что это такое?
std::string_view - это супер-легкий объект, который ничего не хранит сам. Он просто «смотрит» на существующую строку. Внутри него только указатель на начало текста и длина. Никаких аллокаций. Никаких копий. Ноль оверхеда. 🆚 Сравним: // 🐢 ПЛОХО (до C++17)
void Log(const std::string& msg) { / ... / } // При вызове создается временный std::string!
Log("Critical Error"); // 🚀 ХОРОШО (C++17)
void Log(std::string_view msg) { / ... / } // Никаких аллокаций. Просто передаем указатель и длину.
Log("Critical Error"); 🔥 Суперсила: Substrings без боли
Самое вкусное начинается, когда нужно взять подстроку. ⚫️std::string::substr() - создает новую строку (копирование + аллокация).
⚫️std::string_view::substr() - просто сдвигает указатель и меняет размер (математическая операция за наносекунды). ⚠️ Осторожно! (Подводный камень)
Так как string_view не владеет данными, а только смотрит на них, вы должны быть уверены, что исходная строка живет дольше, чем string_view. ⚫️ ✅ Использовать как аргумент функции.
⚫️ ❌ Возвращать из функции, если исходная строка была локальной переменной. 💡 Итог:
Если вам нужно только «почитать» строку (в аргументах функции), почти всегда используйте std::string_view вместо const std::string&. #cpp #cpp17 #optimization #stringview #coding #tips ➡️ @cpp_geek