Почему std::vector <bool> не имеет .data()?

Специализация std::vector<bool>, как указано в С++ 11 23.3.7/1, не объявляет член данных (например, упомянутый здесь и here).

Возникает вопрос: почему у std::vector нет .data()? Это тот самый вопрос, почему вектор векторов bools не хранится постоянно в памяти. Каковы преимущества в том, чтобы не делать этого?

Почему указатель на массив bools не возвращается?

Ответы

Ответ 1

Почему у std::vector нет .data()?

Поскольку std::vector<bool> хранит несколько значений в 1 байт.

Подумайте об этом как о сжатой системе хранения, где каждое логическое значение требует 1 бит. Таким образом, вместо того, чтобы иметь один элемент на блок памяти (один элемент на ячейку массива), макет памяти может выглядеть следующим образом:

введите описание изображения здесь

Предполагая, что вы хотите индексировать блок для получения значения, как бы вы использовали оператор []? Он не может вернуть bool& (поскольку он возвращает один байт, в котором хранится более одного bools), поэтому вы не можете назначить ему bool*. Другими словами, bool *bool_ptr =&v[0]; является недопустимым кодом и приведет к ошибке компиляции.

Более того, правильная реализация может не иметь такой специализации и не выполнять оптимизацию памяти (сжатие). Таким образом, data() придется копировать в ожидаемый тип возвращаемого значения в зависимости от реализации (или стандарт должен принудительно оптимизировать, а не просто разрешать его).

Почему указатель на массив bools не возвращается?

Потому что std::vector<bool> не сохраняется как массив bools, поэтому никакой указатель не может быть возвращен простым способом. Он мог бы сделать это, скопировав данные в массив и вернув этот массив, но это выбор дизайна не для этого (если бы они это сделали, я бы подумал, что это работает как data() для всех контейнеров, что вводит в заблуждение).

Каковы преимущества в том, чтобы не делать этого?

Оптимизация памяти.

Обычно в 8 раз меньше использования памяти, поскольку он хранит несколько бит в одном байте. Точнее, CHAR_BIT раз меньше.