繁体   English   中英

C++ 位域的问题

[英]Issues with C++ bitfields

我必须写一个具有特定数据格式的文件 header。 为简单起见,我们假设它是:

  • 位[0-7]:索引a
  • 位 [8-9]:索引 b
  • 位 [10-15]:索引 c

它们都是简单的无符号整数。 我想我可能会使用位字段来获得一个很好的语法。 我定义了

struct Foo {
  unsigned int a : 8, b : 2, c : 6;
};

但是,我得到sizeof(Foo) == 4 为什么? 我希望这里有一个 2 字节的结构。 编译器是否在我的字段之间添加了填充? 如果我使用unsigned char作为我的成员类型,我得到 2 个字节的大小。

cppreference上,它说:

多个相邻的位字段通常打包在一起(尽管这种行为是实现定义的)。

这是否意味着我不能依赖于将字段打包在一起? 最后,我将使用memcpy将此struct转换为 stream 字节并将其写入文件。 这不是很好地使用位字段吗? 这只有在保证这些位被打包在一起时才有效。

编辑:实际的 header 与GIF 格式有关。 许多索引都被打包成几个字节。 其中一些由 1、2、3 或更多位组成。

来自[class.bit]/1 [摘录]:

[...] class object 中位字段的分配是实现定义的。 Alignment 个位域是实现定义的。

并且,来自[defns.impl.defined]

实现定义的行为

行为,对于格式良好的程序构造和更正数据,这取决于实现并且每个实现文档

因此,对于可移植的实现,您不能依赖任何特定类型的行为来实现实现定义的行为。 但是,如果您正在为特定平台和编译器进行开发,则可以在一定程度上依赖记录的实现定义的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM