如果我有结构:
struct foo
{
int ibar;
std::bitset<32> bsbar;
float fbar;
};
bitset是否保证ibar
和bsbar
之间没有填充字节,并且此结构的大小始终为12
(用于memcpy操作)?
答案 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。