位段
针对类或结构中unsigned或int成员,C++提供了为其指定存储位数的能力,这种成员称为位段。利用位段可用最小的位
数来存放数据以更好地利用内存。位段成员必须被声明为unsigned或int类型。
1 struct BitCard{
2 unisgned face:4;
3 unsigned suit:2;
4 unsigned color:1;
5 };
包括了3个unsigned型位段:face,suit和color,用于表示一副牌中的一张牌。声明位段的方式是这样的,在unsigned或
int成员后加一冒号,然后再加一个标识位段宽度(即成员被存储的位数)的整形常量。位段宽度必须是在0和存储一个int
型值所需位数之间的一个整数常量。前面的结构定义表明face在存储中占4位,成员suit占2位,成员color占1位。这些位
数基于每个结构成员取值的范围。成员face存储在0(标识牌A)与12(表示牌K)之间的一个整数,因此需要4位存储在(
4位可表示在0到15之间的任一个整数)。成员suit取值范围0到3(0代表方块,1代表红桃,2代表梅花,3代表黑桃),因
此只需要2位来存储这个值。成员color要么取值为0,要么为1,因此只需1位来存储。
c++可以指定命名的位段,此时位段在结构中用来作“填充项”。
struct Example{
unsigned a:13;
unsigned :3;
unsigned b:4;
};
unsigned a:13;
unsigned :3;
unsigned b:4;
};
上面将3位的位段定义为“填充项”,其中不存放任何内容;成员b 成存放于另一个存储单元中。宽度为0的未命名位段通常
用于将下一个位段对齐于新的存储单元。
structure Example{
unsigned a:13;
unsigned :0;
unsigned b: 4;
};
unsigned a:13;
unsigned :0;
unsigned b: 4;
};
用一个未命名的0位位段来跳过a所在存储单元中剩余的位,一边在下一个存储单元中对齐成员b。位段操作与机器有关。有
些汲取允许位段跨越字边界,而有些机器不允许不能访问位段中单独的位,位段不是“位的数组操作符&不能用于位段,它
们没有地址位段能节省空间,但它们也会导致编译器生成更慢的机器执行代码。