bitset 是否保证连续性?
Is bitset guaranteed contiguity?
Swift 简单的问题:std::bitset
保证在内存中是连续的吗?
我知道它遵守 CopyConstructible 和 CopyAssignable 概念,但它是否也是像 std::vector
这样的 ContiguousContainer(或类似的东西)?
除了填充之外,我还想对这样的结构进行按位运算:
struct tmp
{
std::bitset<32> b;
unsigned int c;
};
所以b
的连续性很重要。当然,这导致知道 std::bitset
是否是标准布局 class,以便每个位运算都有效。
标准中没有要求 std::bitset<>
具有任何特定的布局或位顺序。
将所需的位数指定为模板参数这一事实确实意味着内存被分配为一个连续的块(数组成员)。因为分配一个以上的块会更复杂、效率更低并且没有任何用处。
不过,我不建议也不赞成访问 std::bitset<>
的内部表示。
没有这样的保证。 std::bitset
根据我的经验,界面很笨拙,所以我也看不出以未定义的方式使用它有什么意义。
只需像 class 一样编写您自己的位集,并确保您需要的布局和存储空间。
就个人而言,我会喜欢它。而且我觉得 bitset
界面(尤其是 construction/serialization/deserialization)不是特别好,所以我什至不会感到内疚。 (我想写一个有效的计数,any,all 和 none 有点工作,但其他一切都是微不足道的。如果你正在编写汇编 instructions/using SSE intrinstics,你可能能够 match/exceed 无论如何你的编译器的实现)
Swift 简单的问题:std::bitset
保证在内存中是连续的吗?
我知道它遵守 CopyConstructible 和 CopyAssignable 概念,但它是否也是像 std::vector
这样的 ContiguousContainer(或类似的东西)?
除了填充之外,我还想对这样的结构进行按位运算:
struct tmp
{
std::bitset<32> b;
unsigned int c;
};
所以b
的连续性很重要。当然,这导致知道 std::bitset
是否是标准布局 class,以便每个位运算都有效。
标准中没有要求 std::bitset<>
具有任何特定的布局或位顺序。
将所需的位数指定为模板参数这一事实确实意味着内存被分配为一个连续的块(数组成员)。因为分配一个以上的块会更复杂、效率更低并且没有任何用处。
不过,我不建议也不赞成访问 std::bitset<>
的内部表示。
没有这样的保证。 std::bitset
根据我的经验,界面很笨拙,所以我也看不出以未定义的方式使用它有什么意义。
只需像 class 一样编写您自己的位集,并确保您需要的布局和存储空间。
就个人而言,我会喜欢它。而且我觉得 bitset
界面(尤其是 construction/serialization/deserialization)不是特别好,所以我什至不会感到内疚。 (我想写一个有效的计数,any,all 和 none 有点工作,但其他一切都是微不足道的。如果你正在编写汇编 instructions/using SSE intrinstics,你可能能够 match/exceed 无论如何你的编译器的实现)