什么是位段?
strucr code
{
int c1 :7;
int c2 :6;
int c3 :19;
}
这就是位段了。跟结构体很类似,不过他在每个成员的定义的后面多加了一个 : 跟一个数字,这个数字用来限定这个成员所占内存的bit位。这就是说,c1占了占7位,c2占了6位,c3占了19位,加在一起32位,才一个字节。这样,本来要占3个字节的结构体,现在一个字节就搞定了,这样就节省了很多很多的内存空间。
结构体有内存对齐,那么位段有没有呢?答案是位段也有对齐,不过跟结构体的不大相同就是了。位段的存储有几个特点:
1:他的成员的大小不能比机器定义的类型大。比如,一个int占32位,你非要给它33位,这样就不行了,就想气球一样,会炸的- -
2:当上一个成员的剩余字节 不够存储下一个成员时,他会另起 一个字开始存储,比如,{ int c1:20; int c2:20 },int是32位的,c1用了20位,剩余的12位不够存放c2,那么就另外 拿出32位,并从起始的地方存储c2。所以这样一共占用了两个字节。如果把刚才的c2改成12位火12位一下,那么c1用剩的空间c2就够用了,所以他会紧跟着c1结束的地方开始存放,这样一共就占用了32位,也就是1个字节了。
3:位段中的对齐数是根据其中成员最大类型来定的。比如{ int c1:26; char c2:7 },int型的c1用了26位,不够放c2的7位,那么,他对拿出int型的32位来,从开始的地方存放这7位的char c2,而不是拿出8位的char类空间来存放。 所以,上例一共会占用64位,也就是8个字节。