我可以合法地将所有真假之间的bool结构记忆化吗?

时间:2018-11-27 20:27:40

标签: c++ memset

我有个布尔结构。
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。我还想默认将它们保留为false。我想偶尔将它们全部设置为true的原因是,它对于单元测试和代码覆盖很有用。

1 个答案:

答案 0 :(得分:3)

由于在编译时已知bool的数量,因此您可以轻松地用bitset替换这些结构

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

可以简单地成为bitset<3U>。这将允许您使用:

  • set将所有位设置为true
  • reset将所有位设置为false

boolean type使用memset的关键问题是:

  

sizeof(bool)的值是实现定义的,可能不同于1

因此,在实现上定义了bool是否将foo假定位于memset(&f, true, sizeof f)中的每个存储器字节上。