std :: bitset是否保证连续内存以及结构中的常量大小(以避免填充?)

时间:2014-11-26 23:08:17

标签: c++ c++11 data-structures bitset

如果我有结构:

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

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

2 个答案:

答案 0 :(得分:1)

不,你应该首先测试并看看答案是什么:

#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) 
}

答案 1 :(得分:1)

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

  

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

实现允许您通过Pragma或编译器标志“打包”结构。海湾合作委员会承认pack attribute