Я работаю с пользователем-де определенное количество бит (у меня есть трехмерный массив бит, поэтому размер увеличивается кубически - предположим, не менее 512 бит), и мне нужно перевернуть их каждый по отдельности. Прямо сейчас я использую только на компьютере тип bool
, поскольку память не является проблемой. Я действительно планирую перенести код на микроконтроллер в будущем, поэтому вычислительная мощность и требования к памяти могут быть проблемой. Но сейчас мне просто нужна скорость.
Затем я нашел объект std :: bitset
из C ++ STL , но я не могу определить размер битового набора во время выполнения. Затем я обнаружил, что std :: vector
имеет специальный инициализатор для хранения их в виде битов (вместо целых байтов или 4 байтов), но затем обнаружил этот раздел в Википедии. :
Стандартная библиотека определяет специализацию шаблона
vector
дляbool
. В описании этой специализации указано, что реализация должна упаковать элементы так, чтобы каждыйbool
использовал только один бит памяти. Многие считают это ошибкой. [...] Комитет по стандартизации C ++ и Рабочая группа по библиотеке пришли к общему мнению, чтоvector
следует исключить и впоследствии удалить из стандартной библиотеки, а функциональность будет повторно введена под другим именем.
Теперь вы, вероятно, видите, что я хочу использовать объект vector
, но, прочитав это, я подумываю использовать что-нибудь еще. Единственная проблема в том, что я не уверен , что использовать. Мне было любопытно, почему они заявляют, что функциональность должна быть повторно введена (хотя и под другим именем).
Итак, мой вопрос, будет ли использование vector
объекты могут быть приемлемы (поскольку они являются частью STL)? Являются ли они частью стандарта C ++?
Если их использование неприемлемо, есть ли приемлемое альтернативное решение (помимо того, что я сам определяю специальный контейнер)? У меня есть несколько идей, но мне просто интересно, есть ли у кого-нибудь лучшее решение. Кроме того, я бы хотел избежать использования больших библиотек (опять же, я хочу в конечном итоге перенести этот код на микроконтроллер).
Нет ничего плохого в vector<bool>
, за исключением того, что он не эквивалентен vector<T>
, где T - целочисленный тип, эквивалентный bool. Это показывает только производительность (процессоры обращаются только к байтам за раз, где в vector<bool>
каждый элемент хранится в одном бите) и доступ к памяти (ссылка на первый элемент vector<bool>
не эквивалентна массиву, подобному с любым другим vector<T>
.
Это, к сожалению, является частью стандарта: см. раздел 23.3.7
(C ++ 0x FDIS).
Альтернативой может быть BitMagic , хотя я не уверен, что он работает на любой другой архитектуре, кроме x86 (она сильно оптимизирована с использованием SIMD).
Нет ничего плохого в правильном использовании vector<bool>
, точно так же, как нет ничего плохого в auto_ptr
- если вы знаете недостатки и неожиданности, прежде чем продолжить.