Самый эффективный способ хранить больше логических значений - PullRequest
4 голосов
/ 02 января 2011

Мне нужно хранить ровно четыре логических значения в моей структуре в c. Да, я мог бы использовать четыре целых числа или поместить их в массив, но я бы хотел сделать это немного лучше. Я думал о int вроде «0000», где каждое число будет представлять логическое значение, но тогда при редактировании я не могу редактировать только одну цифру, верно? Это тоже не выглядит идеально ...

Спасибо за любые идеи

Ответы [ 5 ]

17 голосов
/ 02 января 2011

Вы можете использовать структуру битового поля:

struct foo {
  unsigned boolean1 : 1;
  unsigned boolean2 : 1;
  unsigned boolean3 : 1;
  unsigned boolean4 : 1;
};

Затем вы можете легко редактировать каждое логическое значение отдельно, например:

struct foo example;
example.boolean1 = 1;
example.boolean2 = 0;
2 голосов
/ 02 января 2011

Использование типа int, например «0000», вызывается с использованием битового поля и выполняется довольно регулярно на практике.Да, вы можете редактировать отдельные значения, используя битовое смещение .Лично я предпочел бы использовать int для структуры битового поля, поскольку вы можете расширить до 32 значений (если вы, конечно, используете 32-битное int) без необходимости изменять структуру.

1 голос
/ 03 января 2011

Если вы храните миллионы таких файлов, делайте это как упакованные биты.

Если вам нужно обращаться к нему миллионы раз в секунду, делайте это как целые (или шорты, или символы).

Если нет, то это не имеет значения.

Если и то и другое, у вас может быть серьезная настройка производительности.

0 голосов
/ 02 января 2011
struct _eMyBool
{
    int m_iOne : 1;
    int m_iTwo : 1;
    int m_iThree : 1;
    int m_iFour : 1;
} eMyBool;

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

Поскольку дополнительный код сборки, сгенерированный для его обработки, имеет свою цену!

Например, прочитайте эту статью MSDN

AFAI Помните, я думаю, что должно быть отношение как минимум 7 для полученной памяти, потому что занимает место дополнительный код для сдвига битов при доступе коднобитный элемент выравнивания действительно важен.

Это статья в Википедии о выравнивании данных.

0 голосов
/ 02 января 2011

Можно сделать, используя

http://en.wikipedia.org/wiki/Stdbool.h

bool a = true;  // Could also be 'bool a = 1;'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...