в документация, я могу увидеть это std::vector<bool>
оптимизирован для экономии пространства, так как каждый логический элемент занимает один бит. Из документации:
Способ, которым std :: vector делается эффективным в пространстве (а также оптимизируется ли он вообще), определяется реализацией.
Значит ли это, что это зависит от реализации компилятора?
Если да, где я могу проверить, поддерживает ли мой компилятор это? Почему они не хотят, чтобы это поддержали? Похоже, действительно простая и эффективная реализация.
Если нет, что это значит и что это означает, если я хочу, чтобы эта оптимизация состоялась?
Я использую набор инструментов TDM GCC.
Формальное определение языка не хочет исключать разумные реализации, поэтому они всегда должны быть немного осторожны.
Например, типичная отладочная сборка все еще соответствует стандартам, но я очень хорошо мог видеть vector<bool>
не сжимается в режиме отладки.
Теперь это не неопределенные но реализация определена. Это означает, что факт, является ли он сжатым, должен быть где-то в документации компиляторов, но Стандарт не описывает, как должна быть организована документация.
Если ваш компилятор не поддерживает его так, как вам хотелось бы, вы можете просто использовать другую библиотеку (очевидным кандидатом является Boost). vector<bool>
обычно это не тот класс, который зависит от глубокой магии компилятора, поэтому альтернативы легко написать.
Реализация определена означает, что это зависит от того, что составляет параметры абстрактной машины. (То есть алгоритмы, которые определяют операционную систему вашего хоста, спецификацию их реализации и системные вызовы). Информативный вопрос&А что означает «определенная реализация» Вот.
Скорее всего, если у вас есть современная машина с современным компилятором / IDE, она поддерживает определение реализации.
Если компилятор не поддерживает его, это маловероятно, потому что они этого не «хотят», а потому, что это либо очень старый компилятор, либо машина с очень ограниченными ресурсами.
Это сводится к тому, что это зависит от машины; так что разные операционные системы будут справляться с этим по-своему. (т. е. 32-разрядный или 64-разрядный и т. д.) Он не влияет на переносимость, если не работает с (очень) более старым компилятором. Вы можете проверить спецификации версии компилятора, если это проблема, которую легко найти в Интернете, выполнив поиск вашего компилятора и его версии.
Это зависит от реализации и не переносимо. Кажется, есть некоторые недостатки дизайна, и вы должны избегать использования vector<bool>
, Вы можете получить более подробную информацию от Мейерса «Эффективный STL, пункт 18».
Если вы действительно заботитесь об эффективности пространства, вы можете использовать std::bitset
вместо.