2016-07-11 4 views
7

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

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

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

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

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

+1

Да, это означает, что реализация 'std :: vector ' в значительной степени зависит от компилятора. Он не может быть оптимизирован вообще, или он может быть оптимизирован с учетом специфики реализации. Как правило, вы узнаете об этом, обратившись к документации для своего компилятора. С GCC и другими инструментальными целями с открытым исходным кодом, я полагаю, вы также можете ознакомиться с исходным кодом. Но это не только требует больше работы, это может быть не очень хорошая идея, поскольку исходные тексты документов реализуются только для реализации, а не для контрактов. –

+1

Простой способ проверить, предоставлена ​​ли такая оптимизация, проверить, является ли 'std :: vector :: reference_type'' bool & 'или что-то еще. В последнем случае у вас есть прокси-тип, который должен быть разрешен только для «оптимизированной» реализации. –

+1

@MatteoItalia 'std :: vector :: reference' требуется, чтобы быть прокси-сервером, даже если реализация фактически не упаковывает биты. –

ответ

2

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

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

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

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

0

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

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

+0

К сожалению, я не могу использовать 'std :: bitset', потому что мне нужна динамическая инициализация. – Simon

+3

FWIW, Boost имеет [dynamic_bitset] (http://www.boost.org/doc/libs/1_61_0/libs/dynamic_bitset/dynamic_bitset.html), но иногда Boost может быть излишним. Если вы знаете, как его использовать, 'std :: vector ' не так уж плохо, в конце концов, как [некоторые указывают] (https://isocpp.org/blog/2012/11/on-vectorbool). – legends2k

3

Реализация определена означает, что она зависит от того, что составляет параметры абстрактной машины. (I.E., алгоритмы, определяющие вашу операционную систему хоста, их спецификацию реализации и системные вызовы). Информативно Q & А на то, что «реализация определена» означает here.

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^