C++ geek
3.61K subscribers
277 photos
5 videos
28 links
Учим C/C++ на примерах
Download Telegram
😱 std::vector<bool>: Великий обман C++

Вы думаете, что std::vector<bool> это просто вектор, который хранит булевы значения? Нет. Это совершенно уникальный монстр, который нарушает правила стандартной библиотеки.

📉 В чем подвох? Обычный bool занимает 1 байт (минимум адресуемой памяти). Но создатели C++ решили сэкономить память. std::vector<bool> - это специализация. Внутри него каждый bool занимает всего 1 бит.

В одном байте хранится сразу 8 значений true/false. Экономия памяти в 8 раз! Круто?

🛑 Проблема: Вы не можете взять адрес элемента

В C++ нельзя создать указатель или ссылку на отдельный бит. Память адресуется байтами.


std::vector<int> nums = {1, 2};
int* p = &nums[0]; // ОК. Указатель на первый int.

std::vector<bool> flags = {true, false};
bool* b = &flags[0]; // ОШИБКА КОМПИЛЯЦИИ!
// Мы не можем получить адрес бита.



🤖 Проблема: Прокси-объекты

Когда вы пишете flags[0], вектор возвращает не bool& (ссылку), а специальный временный объект - Proxy Class (std::vector<bool>::reference).

Этот объект "притворяется" ссылкой. Когда вы присваиваете ему значение, он делает побитовые сдвиги и маски (&, |, <<), чтобы изменить нужный бит внутри байта.

Это медленно.

⚠️ Ловушка с auto


std::vector<bool> vec = {true, false};

// Вы думаете, что val — это bool.
// На самом деле val — это 'std::vector<bool>::reference'.
auto val = vec[0];

vec.push_back(true); // Реаллокация памяти!

// 💥 Если val — это прокси, он может ссылаться на
// старую, уже удаленную память вектора.
val = false; // Undefined Behavior / Crash



💡 Что делать?

1. Если вам важна память: Используйте std::vector<bool> (или std::bitset для фиксированного размера).

2. Если вам важна скорость: Используйте std::vector<char> или std::vector<uint8_t>. Это займет в 8 раз больше памяти, но будет работать мгновенно, и вы получите нормальные ссылки.

3. Осторожно с auto: Всегда пишите тип явно: bool val = vec[0];, чтобы заставить прокси превратиться в значение.

#cpp #stl #vector #gotchas #memory #coding #tips

➡️ @cpp_geek
👍84