位段
位段的作用是节省内存空间,因为有的成员不需要那么大的空间,因此可以通过位段来节省空间
位段不会进行内存对齐
其实位段算是结构体,结构体实现了位段
位段的声明类似于结构体,有两个不同
位段的成员需要是 int、unsigned int、signed int 、char
位段的成员名后边有一个冒号和一个数字(比结构体成员多了冒号和数字),表示这个成员占多少个比特位(bit位)
位段的内存分配没有标准规定,一般情况下是,先开辟一块成员数据类型大小的空间,依次存放每个成员,直到这一块空间不够存放下一个成员了,会再开辟一块成员数据类型大小的空间,继续存放成员,依此类推
因为在非第一次开辟空间的时候,之前空间剩余的字节要不要被使用并没有规定,因此每个编译器可能会存在差异,因此位段也不具有跨平台性,也就是不具有可移植性
(VS编译器就不会使用之前空间剩余的字节)
位段的跨平台问题
1. int 位段被当成有符号数还是无符号数是不确定的。
2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成30,在16位机器会出问题。
3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。