TGViewer
C++ geek C++ geek @cpp_geek · 3.53K subscribers
Post #404 1.96K
😱 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
  • 👍 8
  • ❤ 4
More from @cpp_geek
  1. Sep 24, 2026🎥 Вебинар по C++: Паттерн многопоточного программирования «Producer-Consumer» Когда неско…
  2. Sep 24, 2026Execution policy для параллельных алгоритмов Execution policy в C++ — это новшество, введе…
  3. Sep 17, 2026В чем разница между git fetch и git pull? Разница между этими командами заключается в том,…
  4. Sep 15, 2026std::tie std::tie — это функция, которая создает кортеж ссылок на lvalue из своих аргумент…
  5. Sep 11, 2026move constructor Move-конструктор — это специальный конструктор, который позволяет эффекти…
  6. Sep 9, 2026Move-only объекты и почему std::unique_ptr нельзя копировать Многие удивляются, когда комп…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →