【问题标题】:Size of a structure having unsigned short ints具有 unsigned short int 的结构的大小
【发布时间】:2014-12-16 14:05:06
【问题描述】:

我在浏览我们的一个组织数据文档时遇到了以下代码。

struct A {
 unsigned short int i:1;
 unsigned short int j:1;
 unsigned short int k:14;
};


int main(){
 A aa;
 int n = sizeof(aa);
 cout << n;
}

最初我认为大小为 6 个字节,因为 unsigned short int 的大小为 2 个字节。但上述代码的输出是 2 个字节(在 Visual Studio 2008 上)。

i:1j:1k:14 是否有可能使它成为位字段或其他东西?这只是一个猜测,我不太确定。有人可以帮我吗?

【问题讨论】:

  • 这是一个位字段。大小为 16 位。这个问题范围很广,书中已经解释过很多次了。
  • 你猜对了,这是位域的语法。您可以通过检查 c 或 c++ 中位域的参考来轻松验证这一点。

标签: c++ c bit-fields


【解决方案1】:

是的,确实是bitfield

好吧,我不太确定c++,但是c99 标准中,根据第6.7.2.1 (10) 章:

实现可以分配任何大到足以容纳位字段的可寻址存储单元。如果有足够的空间,结构中紧跟在另一个位域之后的位域将被打包到同一单元的相邻位中。如果剩余空间不足,则是否将不适合的位字段放入下一位或与相邻单元重叠是实现定义的。单元内位域的分配顺序(高位到低位或低位到高位)是实现定义的。未指定可寻址存储单元的对齐方式。

这使您的结构大小(1 位 + 1 位 + 14 位)= 16 位 = 2 个字节。

注意:这里不考虑结构填充。


编辑:

根据C++14 标准,第 9.7 章,

表单的成员声明符

标识符opt属性说明符序列opt:常量表达式

指定一个位域;它的长度由冒号从位域名称开始。 [...] 类对象中位域的分配是 实现定义。位域的对齐是实现定义的。位域被打包到一些可寻址的分配单元中。

【讨论】:

  • 至少 2个字节大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2019-12-12
相关资源
最近更新 更多