Оптимизация std::vector<bool>

В документации я вижу, что std::vector<bool> оптимизирован для экономии пространства, так как каждый логический элемент занимает один бит. Из документации:

Способ, которым std::vector делается эффективным в пространстве (а также оптимизируется ли он вообще), определяется реализацией.

Значит ли это, что это зависит от реализации компилятора? Если да, где я могу проверить, поддерживает ли мой компилятор это? Почему они не хотят, чтобы это поддержали? Похоже, действительно простая и эффективная реализация.

Если нет, что это значит и что это означает, если я хочу, чтобы эта оптимизация состоялась?

Я использую набор инструментов TDM GCC.

3 ответа

Решение

Формальное определение языка не хочет исключать разумные реализации, поэтому они всегда должны быть немного осторожны.

Например, типичная отладочная сборка все еще соответствует стандартам, но я очень хорошо мог видеть vector<bool> не сжимается в режиме отладки.

Теперь это не является неопределенным, но определяется реализацией. Это означает, что факт, является ли он сжатым, должен быть где-то в документации компиляторов, но Стандарт не описывает, как должна быть организована документация.

Если ваш компилятор не поддерживает его так, как вам хотелось бы, вы можете просто использовать другую библиотеку (очевидным кандидатом является Boost). vector<bool> обычно это не тот класс, который зависит от глубокой магии компилятора, поэтому альтернативы легко написать.

Определенная реализация означает, что это зависит от того, что составляет параметры абстрактной машины. (IE, алгоритмы, которые определяют операционную систему вашего хоста, спецификацию их реализации и системные вызовы). Информативные вопросы и ответы о том, что означает "определенная реализация", здесь.

Скорее всего, если у вас есть современная машина с современным компилятором /IDE, она поддерживает определение реализации.

Если компилятор не поддерживает его, это маловероятно, потому что они этого не "хотят", а потому, что это либо очень старый компилятор, либо машина с очень ограниченными ресурсами.

Это сводится к тому, что это зависит от машины; так что разные операционные системы будут справляться с этим по-своему. (т. е. 32-разрядные против 64-разрядных и т. д.). Это не влияет на переносимость, если не работать с (очень) более старым компилятором. Вы можете проверить спецификации версии компилятора, если это проблема, которую легко найти в Интернете, выполнив поиск вашего компилятора и его версии.

Это зависит от реализации и не переносимо. Кажется, есть некоторые недостатки дизайна, и вы должны избегать использования vector<bool>, Вы можете получить более подробную информацию от Мейерса "Эффективный STL, пункт 18".

Если вы действительно заботитесь об эффективности пространства, вы можете использовать std::bitset вместо.

Другие вопросы по тегам