1.位段
首先要注意的是,位段是依托结构体存在的,即位段只能在结构体内使用。其次,位段的使用对象是比特位i,而不是字节。
看下面的代码。
可以看到,第一个结构体与第二个结构体的差别仅仅在于后者使用了位段。如何求结构体的字节我们已经很清楚了,那么如果加上了位段的话,即表示该变量只需占用指定比特位的空间。如在第二个结构体里,首先a是int类型,那么系统会为其开辟4个字节,即32个比特位的空间,但是后面的“:2”说明使用者只需要其占用2个比特位的空间,那么即使开辟了32个比特位,a也只会占用其中2个比特位的空间,这时还剩30个比特位。对b来说,它也只需要2个比特位的空间,于是在剩下的30个比特位中又拿出两个给了b,此时还剩28个比特位,依次类推,则实际上只用开辟一次空间就可以把四个变量储存起来(注意,虽然一共只占用了8个比特位,但是系统为其开辟的空间仍旧是32个比特位,其他空间则被浪费了。)因此第二个结构体的大小就是4个字节。
当然,也有可能只开辟一次空间不够的情况。
例如这种情况,系统首先为a开辟一个字节的空间,但a实际只占用了4个比特位,此时还剩5个比特