C++ 位集是否保证连续性?

C++ 位集是否保证连续性?,c++,c++11,c++14,memory-layout,C++,C++11,C++14,Memory Layout,快速而简单的问题:std::bitset是否保证在内存中是连续的 我知道它遵循可复制可构造和可复制可分配的概念,但它也是像std::vector这样的连续容器(或类似的东西)吗 除了填充之外,我还想对如下结构进行位操作: struct tmp { std::bitset<32> b; unsigned int c; }; struct tmp { std::位集b; 无符号整数c; }; 因此,b的连续性非常重要。当然,这会导致了解std::bitset是否

快速而简单的问题:
std::bitset
是否保证在内存中是连续的

我知道它遵循可复制可构造和可复制可分配的概念,但它也是像
std::vector
这样的连续容器(或类似的东西)吗

除了填充之外,我还想对如下结构进行位操作:

struct tmp
{
    std::bitset<32> b;
    unsigned int    c;
};
struct tmp
{
std::位集b;
无符号整数c;
};

因此,
b
的连续性非常重要。当然,这会导致了解
std::bitset
是否是一个标准布局类,这样每个按位操作都可以工作。

标准中没有要求
std::bitset
具有任何特定的布局或位顺序

将所需的位数指定为模板参数这一事实确实意味着内存被分配为一个连续块(数组成员)。因为分配多个区块会更复杂,效率更低,并且没有任何用处


然而,我不建议或支持访问
std::bitset的内部表示形式,因为没有这样的保证<根据我的经验,code>std::bitset
有一个笨拙的界面,因此我也不认为以未定义的方式使用它有什么意义

只需编写自己的类似位集的类,并提供所需的布局和存储保证


就我个人而言,我会喜欢的。而且我不认为
位集
接口(尤其是构造/序列化/反序列化)特别好,所以我甚至不会感到内疚。(我想写一个有效的计数,any,all和none都是一点工作,但是其他的一切都是琐碎的。如果你在写汇编指令/使用SSE intrinstics,你可能无论如何都能匹配/超过你的编译器实现)

你的意思是
联合{std::bitset b;unsigned int c;}?不,不是。既然你已经知道答案,为什么还要问?提示-仅保证标准中指定的内容。否,
struct
。我想在内存中有两个字段,一个
位集
和一个整数。@SergeyA我知道这两个保证,但我想知道是否有任何保证可以保证内存布局简单。你在任何地方看到这个保证了吗?我没有。因此,不能保证。VTC认为这个问题不清楚。即使内存可能分配在一个块中,也没有好的方法获得指向第一位的指针。OP打算直接对这样一个对象应用逐位操作,因此他隐式地假设对象只包含这些位(或者不关心对象是否损坏)。@Aleph True,我不建议或支持访问
std::bitset
的内部表示形式。只要确保OP不尝试这样做:)。是的,我不在乎腐败。但是,如果我不能确定,例如,
位集
本质上是一个
char
s(或类似的)数组,那么除了编写自己的容器之外,我别无选择。@senseiwa“我不关心损坏”--那你就不明白了。