为什么这个结构的大小是12而不是10
Why is the size of this struct 12 and not 10?
可能重复:
为什么不是';t结构的sizeof等于每个成员的sizeof之和?
我正在尝试解析ID3v2标签,至少可以获得艺术家、标题和专辑等重要数据,但在设置必要的结构时遇到了问题。
struct ID3v2_frame{
char id[4];
unsigned int size;
bool flags[2];
};
ID3v2_frame frame;
cout<<sizeof(frame)<<endl;
我想这是一个如何设置4字节int的问题。当我输出sizeof(frame)时,它输出12,我的预期输出是10。我在一台64位linux机器上运行。
请检查您的主程序:
sizeof(bool) //should return 2 my guess
sizeof(char) //should return 1
sizeof(unsigned int) //should return 4
每个编译器的数据类型可以有不同的大小。
注意x64上的布尔大小为2字节
您可以从这里或这里找到答案。
请检查一下什么包装?默认包装(8)
这是因为结构封装。编译器将使结构的大小为4字节的倍数。如果您不希望发生这种情况,并且在您的情况下大小为10字节,请使用__attribute__((packed))
struct ID3v2_frame{
char id[4];
unsigned int size;
bool flags[2];
}__attribute__((packed));
请注意,这可能会影响程序的性能。请参阅此SO问题:
__attribute__((压缩))会影响程序的性能吗?
我的猜测是flags和id数组中的终止符。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 为什么用结构初始化数组需要指定结构名称
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 为什么除了继承聚合结构之外,结构为空,无法聚合初始化?
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 为什么未命名的结构内联变量在每个翻译单元中没有相同的地址?
- 为什么我在初始化带大括号的结构时出错?
- 为什么我们再次从结构对象创建结构变量?
- 为什么 C++ 中的以下结构声明会导致退出 127?
- 为什么我们使用在C++中返回数据结构的函数?
- 为什么结构化绑定不使用"auto&"返回对结构成员的引用,而是返回成员本身
- 为什么"具有常量成员的结构"类型的指针不能指向"具有非常量成员的结构"?
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 为什么 boost::comb 对结构化绑定的支持缺少结构化绑定机制对 boost::tuples::cons 的适应?
- 为什么Microsoft在新代码中使用结构而不是类?
- 为什么继承的结构成员在联合中无法访问?
- 为什么结构化绑定不支持可变数组?
- 为什么这个结构需要 24 个字节
- NTTP 的结构类型:为什么所有成员都必须是公共的?