Стандартный класс
std::string в C++ имеет несколько механизмов оптимизации для повышения производительности и уменьшения расхода памяти. Рассмотрим основные из них. 🟠Small String Optimization (SSO) – Оптимизация малых строк
Если строка маленькая (обычно до 15-23 байт, зависит от реализации),
std::string не выделяет динамическую память, а хранит символы прямо внутри объекта std::string. Обычно
std::string содержит: - Указатель на динамическую память
- Размер строки
- Вместимость (
capacity) Но если строка короткая, память не выделяется в куче (
heap), а данные хранятся прямо внутри объекта std::string. #include <iostream>
#include <string>
int main() {
std::string small = "Hello"; // Использует SSO
std::string large = "This is a very long string that will not fit SSO"; // Динамическая память
std::cout << "Small string: " << small << "\n";
std::cout << "Large string: " << large << "\n";
}
🟠Copy-on-Write (COW) – Оптимизация копирования (устарела)
Раньше (до C++11)
std::string использовал технику Copy-on-Write (COW), где несколько строк могли разделять одну и ту же память, пока одна из них не изменялась. Почему отказались?
Не потокобезопасно (если один поток меняет строку, другой может получить неожиданные данные). В C++11 было добавлено
std::move, которое делает копирование дешевле. SSO делает COW менее нужной. std::string a = "Hello";
std::string b = a; // Копия не создается, оба указывают на одну память
b[0] = 'X'; // Теперь создаётся отдельная копия
🟠Move Semantics – Семантика перемещения (C++11)
Вместо дорогостоящего копирования
std::string теперь можно перемещать с помощью std::move(), передавая владение ресурсом без копирования. #include <iostream>
#include <string>
int main() {
std::string a = "Hello, world!";
std::string b = std::move(a); // Перемещение, a становится пустой
std::cout << "b: " << b << "\n"; // "Hello, world!"
}
🟠Reserve() – Избегание частых выделений памяти
Если заранее известно, сколько символов потребуется, можно использовать
.reserve(size), чтобы избежать многократных перевыделений памяти. std::string str;
str.reserve(100); // Сразу выделяет память на 100 символов
for (int i = 0; i < 100; i++) {
str += 'a'; // Не перевыделяет память 100 раз
}
Ставь 👍 и забирай 📚 Базу знаний