我必须用特定的数据格式写一个文件头。为了简单起见,让我们假设如下:
它们都是简单的无符号整数。我想我可以使用位字段来获得一个很好的语法。我定义了
struct Foo {
unsigned int a : 8, b : 2, c : 6;
};然而,我得到了sizeof(Foo) == 4。为什么是这样?我以为这里会有2字节的结构。编译器是否在我的字段之间添加填充?如果我使用unsigned char作为我的成员类型,我的大小为2个字节。
在优先选择上,它说:
多个相邻位字段通常被打包在一起(尽管这种行为是由实现定义的)。
这是否意味着我不能依赖被打包的田地?最后,我将使用memcpy将此struct转换为字节流并将其写入文件。这不是很好的使用位字段吗?只有当这些比特被保证打包在一起时,这才能起作用。
编辑:实际的标题与GIF格式有关。许多索引被打包成几个字节。其中一些是由1,2,3或更多位组成的。
发布于 2020-08-18 13:34:33
..。类对象中位字段的分配是实现定义的.位字段的对齐是实现定义的.
以及,来自[defns.impl.defined]
实现-定义的行为 行为,对于格式良好的程序构造和更正数据,依赖于每个实现的实现和文档。
因此,对于可移植的实现,不能依赖任何特定类型的行为来实现--定义的行为。但是,如果您正在为特定的平台和编译器开发,那么您可以在一定程度上依赖于文档化的实现定义的行为。
https://stackoverflow.com/questions/63469656
复制相似问题