2015-09-14 5 views
0

Я пишу программу, которая должна манипулировать очень длинными строками булевых значений. Первоначально я хранили их как динамический массив из unsigned long long int переменных и выполнял побитовые операции на C-стиле.C++ Variable Width Bit Field

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

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

+6

Вы посмотрели на 'std :: bitset'? –

+6

Или, может быть, 'std :: vector ', в зависимости от того, как вы собираетесь «манипулировать» ими. –

+1

И Boost имеет 'dynamic_bitset'. Битвы не будут работать; я думаю, они должны быть постоянной шириной (и не более, чем обычный интегральный тип). –

ответ

0

В соответствии с комментариями std::bitset или std::vector<bool>, вероятно, то, что вам нужно. bitset - фиксированная длина, vector<bool> - динамичный.

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