在结构体中,可以通过位段指定一个成员占多少位二进制,这样就可以最大限度地减少内存浪费;
形式为:
struct sTName{
type val:bitNum;
};
例:
struct Ex{
int a;
int b:5;
int c:9;
int d:15;
};
但实际上Ex结构体的大小还是4个int值的大小!
无名位段
struct Ex1{
short :3;
short x:5;
short :3;
short y:5;
};
以上说明,x成员从第3位到第7位,y成员从第11位开始到第15位,而第0位到第2位及第8位到第10位的内容被忽略;
对于结构体大小的限制,由于位段的规定,在上面的这个结构体中,x,y以及分隔这两个变量所用的位段并没有超过short的大小(两个字节);所以结构体的大小为两个字节。
而位段长度和结构体长度的关系也是值得记录的一个点:
对于位段长度的仔细说明:
#include <iostream>
using namespace std;
int main(){
struct Ex1{
short x:9;
short y:9;
short z:9;
};
struct Ex2{
int x:9;
int y:9;
int z:9;
};
struct Ex3{
int x:9;
int :0;
int z:9;
};
cout << sizeof(Ex1) << endl;
cout << sizeof(Ex2) << endl;
cout << sizeof(Ex3) << endl;
return 0;
}
Ex1:struct Ex1的3个位段占用内存均为9位,连续两个9位超过了short类型的16位,所以占3个short那么大;
Ex2:Ex2的3个位段占27位没有超过int的大小,因此结构体也是4个字节那么大;
Ex3:Ex3在两个位段中指定了一个占0位的无名位段,所以第二三个位段在在第二个int中,则结构体共8个字节。
不能对位段成员取地址