tgoop.com/cpp_geek/345
Create:
Last Update:
Last Update:
Невидимый враг: std::vector<bool>
Кажется, что std::vector<bool>
— обычный вектор из bool. Но на самом деле это не так.
Под капотом vector<bool>
хранит биты плотно упакованными (1 бит на элемент), а не как bool
(обычно 1 байт). Из-за этого:
- Элемент — это не bool&
, а прокси-объект (std::vector<bool>::reference
).
- Нельзя получить настоящий указатель на элемент: &v[0]
не даст bool*
.
- Код работает медленнее из-за лишней возни с битовыми масками.
Пример неожиданности:
std::vector<bool> v{true, false};
auto p = &v[0]; // ❌ Ошибка! Нет bool*
Хотите реально быстрый и предсказуемый контейнер?
- Используйте
std::vector<char>
или std::vector<uint8_t>
для хранения флагов.- Или подключите
boost::dynamic_bitset
, если нужна именно битовая упаковка.Итог:
vector<bool>
— это костыль ради экономии памяти. Если важны скорость и нормальная семантика — обходите стороной.➡️ @cpp_geek
BY C++ geek
Share with your friend now:
tgoop.com/cpp_geek/345