Могу ли я по закону memset составлять структуры bools между всеми true / all false? - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть структура bools.
Он не содержит других элементов данных, кроме bool.

struct foo {
 bool b1 = false;
 bool b2 = false;
 bool b3 = false;
 // many more ...
};

Без использования отражения или генерации кода,
Я ищу легкийспособ установить их всех в true, а затем установить их всех в false.

Допустимо ли их везде записывать в память?

foo f;
memset(&f, true, sizeof f);
memset(&f, false, sizeof f);

Пока я гарантирую, что члены данных всегда являются примитивами, это безопасная и четко определенная операция?Если нет, есть ли какие-либо другие предложения для обеспечения того, чтобы большой набор логических значений (большее количество из которых может быть добавлено в будущем), все они могли быть последовательно установлены в true / false.Я также хотел бы оставить их ложными по умолчанию.Причина, по которой я хочу время от времени устанавливать их значение true, заключается в том, что это полезно для модульных тестов и покрытия кода.

1 Ответ

0 голосов
/ 28 ноября 2018

Поскольку число bool s известно во время компиляции, вы можете легко заменить эти структуры на bitset

struct foo {
    bool b1 = false;
    bool b2 = false;
    bool b3 = false;
};

Может просто стать bitset<3U>.Это позволит вам использовать:

  • set для установки всех битов на true
  • reset для установкивсе биты в false

Ключевая проблема с использованием memset для логического типа состоит в том, что:

Значениеиз sizeof(bool) определяется реализацией и может отличаться от 1

Таким образом, реализация определяется, будет ли bool s находиться в каждом байте памяти в foo, как предполагает memset(&f, true, sizeof f).

...