C++ std::bitset是否保证结构中的连续内存和恒定大小(以避免填充?)

C++ std::bitset是否保证结构中的连续内存和恒定大小(以避免填充?),c++,c++11,data-structures,bitset,C++,C++11,Data Structures,Bitset,如果我有一个结构: struct foo { int ibar; std::bitset<32> bsbar; float fbar; }; structfoo { int-ibar; std::位集bsbar; 浮动fbar; }; 位集是否保证在ibar和bsbar之间没有填充字节,并且此结构的大小始终为12(用于memcpy操作)?否,您应该首先测试并查看答案: #include <iostream> #include <bitse

如果我有一个结构:

struct foo
{
    int ibar;
    std::bitset<32> bsbar;
    float fbar;
};
structfoo
{
int-ibar;
std::位集bsbar;
浮动fbar;
};

位集是否保证在
ibar
bsbar
之间没有填充字节,并且此结构的大小始终为
12
(用于memcpy操作)?

否,您应该首先测试并查看答案:

#include <iostream>
#include <bitset>

struct foo
{
    int ibar;
    std::bitset<32> bsbar;
    float fbar;
};

int main(int argc, char const *argv[])
{
    std::cout << sizeof(foo) << std::endl; // 24 on my machine (OS X 10.10 g++4.9.2 64 bit) 
}
#包括
#包括
结构foo
{
int-ibar;
std::位集bsbar;
浮动fbar;
};
int main(int argc,char const*argv[]
{

std::cout在一个类中,任何占用整个内存位置的成员之间都可能有未命名的填充,唯一的例外是标准布局结构的第一个成员:

如果标准布局类对象具有任何非静态数据成员,则其 地址与其第一个非静态数据的地址相同 成员。否则,其地址与第一个成员的地址相同 基类子对象(如果有)。[注意:因此可能存在 标准布局结构对象中的未命名填充,但不在其位置 开始,必要时实现适当对齐。-结束注释 ]


实现允许您通过Pragmas或编译器标志“打包”结构。GCC识别。

位集
与否,回答“是否保证有X个填充字节”始终为否。只要对齐要求保持不变,实现可以出于任何原因或无任何原因添加填充字节。但最终结果为12。因此,如果这是您正在测试的平台,它对确定一般情况毫无帮助。我只是说,对“将始终为12”的响应是否定的,仅此而已。正如@T.C.所提到的,编译器可以进行填充,除非您特别指定对齐方式。呃,请查看错误的状态,并查看谁提交了修复:--它已提交。
std::align
用于将对象放置在缓冲区内的正确对齐方式,即要求编译器对齐i不正确。这与指定对齐方式完全不同。几乎相反。是的,我知道GCC 4.9的功能。您可以停止重复它。谢谢,该页面没有说明它已实现,因为该页面没有涵盖标准库,请参见下表“图书馆实施的状态可以在这里跟踪”,20.6.5说它已经实施了。