【C/C++】位段
零.导言
位段,对初学者来说是一个相对陌生的概念。今天,我将简单的介绍位段的概念。
先说结论:位段和结构体是类似的,并且在空间储存上战友,但同时存在难以跨平台的弊端。
一.位段的声明
我们来简单看一下结构体和位段的区别:
//这是结构体
struct SeqList
{
int arr*;
int size;
int capacity;
};
以上是结构体。
//位段
struct A
{
int _a:2;
int _b:4;
int _c:8;
int _d:12;
};
以上是位段。
可以看出,结构体和位段是极为相似的,其中一个区别在于位段在变量名后加了一个冒号和一个数字,用于确定开辟的空间大小。
二.位段的内存分配
关于位段的内存分配,有几点要特别注意,和结构体不同:
- 位段的成员只能是 int, unsigned int,signed int,char等类型。
- 位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。
- 位段涉及很多不稳定因素,难以跨平台。
从此可以看出:位段可以精细的控制变量所用空间大小,有占用空间小的优点。
三.位段的跨平台问题
- int 位段被当成有符号数还是无符号数是不确定的。
- 位段中最大位的数目不能确定。(比如16位机器最大位是16,32位机器最大位是32)
- 位段中的成员在内存中从左向右分配,还是从右向左分配,标准尚未定义。
- 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。
综上所述:当所写程序涉及跨平台时,还是推荐使用位段而非结构体。
四.相关链接
【C/C++】结构体的定义-CSDN博客
完