Вместо сохранения одного логического значения в байтовом блоке, почему бы не сохранить 8 логических значений в этом же блоке.
Пример: 01010101 = 8 логических значений, 1 3 5 7 = false, 2 4 6 8 = true.
Будет ли это работать?
Есть ли способ лучше?
Какие есть плюсы и минусы в этом?
Будет ли это иметь большое влияние на сети?
То, что вы описали, часто называют битовые поля; они обычно используются, когда пространство стоит дорого (на уровне битов и байтов) или вы действительно пытаетесь что-то уменьшить. Это включает (но не ограничивается):
В противном случае, как и большинство других проблем в программировании, вам лучше использовать решения, которые обрабатывают такие низкоуровневые детали для вас, или сохраняйте свой код как можно более простым для людей. Иногда это означает придерживаться простого bool
с, как он описывает намерения вашего кода. Если ваш язык и кодовая база легко поддерживают битовые поля, это тоже хорошо. Для полноты, C / C ++ поддерживает битовые поля изначально через этот синтаксис структуры двоеточия:
struct Foo {
char f1 : 1;
char f2 : 1;
char f3 : 1;
// ...
};
… где число после двоеточия представляет, сколько битов использует это поле. Есть также vector<bool>
но это проблемный тип, который редко используется в наши дни, и он также неуклюжий.
Чтобы ответить на ваш вопрос более прямо, если вы не работаете с сетевым протоколом с очень малыми издержками, маловероятно, что вам придется работать с битовыми полями. Экономия пространства минимальна по сравнению с обычными временными масштабами в сети, и если вы действительно беспокоитесь об этом, вам лучше использовать готовое решение, такое как буфер протокола.
Ты можешь использовать vector<bool>
для этой цели, поскольку он разработан на основе обеспечения эффективности использования пространства.
vector<bool>
является псевдоконтейнером, который содержит не реальные bools, а упакованное представление bools, предназначенное для экономии места. В типичной реализации каждый «bool», хранящийся в «векторе», занимает один бит, а восьмибитный байт содержит восемь «bool».
Но есть проблема с этим подходом:
Предположим, вы хотите обратиться к отдельным bools в векторе, вы бы сделали что-то вроде:
vector<bool> v;
bool *pb = &v[0];
Но на самом деле нет никакого bool в векторе. Это может создать некоторую проблему при реализации под эгидой сетевого взаимодействия, так как в какой-то момент вам потребуется ссылаться на отдельные объекты bool.