具有无符号短整数的结构的大小

Aze*_*ikh -4 c c++ bit-fields

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

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;
}
Run Code Online (Sandbox Code Playgroud)

最初我认为大小将是6个字节,因为unsigned short int的大小是2个字节.但上面代码的输出是2个字节(On visual studio 2008).

有一点点的可能性i:1,j:1k:14使它有点领域或什么?它只是一个猜测,我不是很确定.有人可以帮我吗?

Sou*_*osh 5

是的bitfield,确实如此.

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

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

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

注意:此处不考虑结构填充.


编辑:

按照C++14标准,章节§9.7,

表单的成员声明者

identifier opt attribute-specifier-seq opt:constant-expression

指定一个位域; 它的长度是通过冒号从位字段名称中设置的.[...]类对象中位域的分配是实现定义的.位字段的对齐是实现定义的.比特字段被打包到一些可寻址的分配单元中.