首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于C++位域的问题

关于C++位域的问题
EN

Stack Overflow用户
提问于 2020-08-18 13:26:33
回答 1查看 163关注 0票数 0

我必须用特定的数据格式写一个文件头。为了简单起见,让我们假设如下:

  • 位0-7:索引a
  • 双边投资条约8-9:索引b
  • 双边投资条约10-15:索引c

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

代码语言:javascript
复制
struct Foo {
  unsigned int a : 8, b : 2, c : 6;
};

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

优先选择上,它说:

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-18 13:34:33

[class.bit]/1提取液

..。类对象中位字段的分配是实现定义的.位字段的对齐是实现定义的.

以及,来自[defns.impl.defined]

实现-定义的行为 行为,对于格式良好的程序构造和更正数据,依赖于每个实现的实现文档

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63469656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档