我在浏览我们的一份组织数据文档时发现了以下代码。
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:1
, j:1
and k:14
使它成为一个位字段或什么?这只是一个猜测,我对此不太确定。有人可以帮我吗?
对,这就是bitfield
, 的确。
Well, i'm not very much sure about c++
, but In c99
standard, as per chapter 6.7.2.1 (10):
实现可以分配任何足够大以容纳位字段的可寻址存储单元。如果剩余足够的空间,则结构中紧跟在另一个位字段之后的位字段应被打包到同一单元的相邻位中。如果剩余空间不足,则不适合的位字段是否放入下一个位或与相邻单元重叠是实现定义的。单元内位字段的分配顺序(高位到低位或低位到高位)是由实现定义的。可寻址存储单元的对齐方式未指定。
这使得您的结构大小(1 位 + 1 位 + 14 位)= 16 位 = 2 字节。
注意:这里不考虑结构填充。
Edit:
As per C++14
标准,第 §9.7 章,
形式的成员声明符
identifieropt attribute-specifier-seqopt: constant-expression
指定一个位域;它的长度由冒号与位字段名称分开。 [...] 类对象中位域的分配是
实现定义的。位字段的对齐是实现定义的。位字段被打包到一些可寻址的分配单元中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)