我在我们的一个组织数据文档中浏览,并且遇到了以下代码。
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个字节(On visual studio 2008)。
i:1
,j:1
和k:14
是否有可能使它成为一个领域或某事?它只是一个猜测,我不是很确定。有人可以帮帮我吗?
答案 0 :(得分:5)
是的,确实是bitfield
。
嗯,我不太确定在c++
,但是c99
标准中,根据章节6.7.2.1(10):
实现可以分配足够大的任何可寻址存储单元来保存位字段。如果剩余足够的空间,则紧跟在结构中的另一个位字段之后的位字段将被打包到相同单元的相邻位中。如果剩余的空间不足,则是否将不适合的位字段放入下一位或重叠相邻单元是实现定义的。单元内的位域分配顺序(高阶到低阶或低阶到高阶)是实现定义的。可寻址存储单元的对齐未指定。
这使得您的结构大小(1位+ 1位+ 14位)= 16位= 2个字节。
注意:此处不考虑结构填充。
编辑:
根据C++14
标准,章节§9.7,
表单
的成员声明者标识符 opt attribute-specifier-seq opt :constant-expression
指定位字段;它的长度是通过冒号从位字段名称中设置的。 [...]类对象中位域的分配是 实现定义。位字段的对齐是实现定义的。比特字段被打包到一些可寻址的分配单元中。