Сохранение памяти с помощью ручных битовых полей против std :: bitset - PullRequest
0 голосов
/ 25 мая 2018

Я изучаю битовые флаги и создаю битовые поля вручную, используя побитовые операторы.Затем я наткнулся на наборы битов, казалось бы, более простой и чистый способ хранения поля битов.Я понимаю ценность использования битовых полей для минимизации использования памяти.После тестирования sizeof (bitset) мне трудно понять, как этот подход лучше.

Рассмотрим:

#include <bitset>
#include <iostream>

int main ()
{

    // Using Bit Set, Size = 8 Bytes
    const unsigned int i1 = 0;
    const unsigned int i2 = 1;

    std::bitset<8> mySet(0);

    mySet.set(i1);
    mySet.set(i2);

    std::cout << sizeof(mySet) << std::endl;

    // Manually managing bit flags

    const unsigned char t1 = 1 << 0;
    const unsigned char t2 = 1 << 1;

    unsigned char bitField = 0;
    bitField |= t1 | t2;

    std::cout << sizeof(bitField) << std::endl;

    return 0;
}

Вывод:

mySet составляет 8 байтов.Значение bitField составляет 1 байт.

Не следует ли использовать std :: bitset, если требуется минимальное использование памяти?

1 Ответ

0 голосов
/ 26 мая 2018

Для минимально возможного объема памяти не следует использовать std::bitset.Это, вероятно, потребует больше памяти, чем обычный встроенный тип, такой как char или int эквивалентного эффективного размера.Таким образом, он, вероятно, имеет накладные расходы памяти, но сколько будет зависеть от реализации.

Одним из основных преимуществ std::bitset является то, что он освобождает вас от аппаратно-зависимых реализаций различных типов.Теоретически, аппаратное обеспечение может использовать любое представление для любого типа, если оно удовлетворяет некоторым требованиям стандарта C ++.Таким образом, когда вы полагаетесь на unsigned char t1 = 1, чтобы быть 00000001 в памяти, это на самом деле не гарантируется.Но если вы создадите набор битов и инициализируете его должным образом, это не принесет вам неприятных сюрпризов.

Заметка о битрейдлинге: принимая во внимание подводные камни, связанные с манипулированием битами таким образом, можете ли вы действительно оправдать эту ошибку?склонный метод вместо использования std::bitset или даже такие типы, как int и bool?Если вы не очень ограничены в ресурсах (например, программирование MCU / DSP), я не думаю, что вы можете.

Те, кто играет с битами, будут кусаться, а те, кто играет с байтами, будут байтены..


Кстати, char bitField, который вы объявляете и управляете с помощью битовых операторов, является битовым полем, но это не понятие языка C ++ о битовом поле, которое выглядит следующим образом:

struct BitField{
    unsigned char flag1 : 1, flag2 : 1, flag3 : 1;
}

Проще говоря, это структура данных, элементы данных которой подразделяются на отдельные переменные.В этом случае unsigned char из (предположительно) 8 битов используется для создания трех 1-битных переменных (flag1, flag2 и flag3).Он явно подразделяется, но, в конце концов, это просто игра с компилятором / языком, похожая на ту, что вы делали выше.Вы можете узнать больше о битовых полях здесь .

...