✂️ C++17: Перестаньте копировать строки! (
Мы привыкли передавать строки в функции по константной ссылке:
Не всегда. 🛑
Если вы передаете в такую функцию обычный текст в кавычках (строковый литерал) или часть другой строки, C++ втайне от вас создаст временный объект
Решение?
👀 Что это такое?
Никаких аллокаций. Никаких копий. Ноль оверхеда.
🆚 Сравним:
🔥 Суперсила: Substrings без боли
Самое вкусное начинается, когда нужно взять подстроку.
⚫️
⚫️
⚠️ Осторожно! (Подводный камень)
Так как
⚫️ ✅ Использовать как аргумент функции.
⚫️ ❌ Возвращать из функции, если исходная строка была локальной переменной.
💡 Итог:
Если вам нужно только «почитать» строку (в аргументах функции), почти всегда используйте
#cpp #cpp17 #optimization #stringview #coding #tips
➡️ @cpp_geek
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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4