首页 > 解决方案 > 我可以在所有真/所有假之间合法地 memset 布尔结构吗?

问题描述

我有一个布尔结构。
它不包含其他数据成员,但bool.

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

在不使用反射或代码生成的情况下,
我正在寻找一种简单的方法将它们全部设置为 true,然后将它们全部设置为 false。

memset 到处都是合法的吗?

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

只要我保证数据成员始终是原语,这是一个安全且定义明确的操作吗?如果没有,是否有任何其他建议可以确保大型集合布尔值(将来可能会添加更多)可以始终设置为真/假。我还想默认保持它们为假。我想偶尔将它们全部设置为 true 的原因是它对单元测试和代码覆盖很有用。

标签: c++memset

解决方案


因为bools 的数量在编译时是已知的,所以您可以轻松地将这些结构替换为bitset

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

可以简单的变成一个bitset<3U>。这将允许您使用:

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

使用布尔类型memset的关键问题是:

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

因此,实现定义了bools 是否将位于内存中的每个字节foomemset(&f, true, sizeof f)


推荐阅读