位段、枚举、联合体
1、位段
1.1、什么是位段?
位段与结构体类似:
1.位段的成员必须是int、unsigned int 或者 signed int。
2.位段的成员名后边有一个冒号和一个数字。
例如:
struct A
{
int _a:2;
int _b:5;
int _c:10;
int _d:30;
};
A就是一个位段
1.2、位段的内存分配
- 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
- 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
- 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
例如:
//一个例子
struct S {
char a:3;
char b:4;
char c:5;
char d:4;
};
struct S s = {
0};
s.a = 10; s.b = 12; s.c = 3; s.d = 4;
在我用的的vs2019编译器上这个位段的内存开辟为:
看到为char类型的a ---->为a创造一个字节,然后a利用了三个比特位 —> 再看到b,上次剩下的五个比特位能满足b,则不用再开辟字节 —>接下来到c,上次剩下的一个比特位不能满足,丢弃一个比特位开辟新的一个字节给c —>剩下三个比特位不能满足d所以再开辟一个字节。
综上:应该总共开辟了三个字节。
可以跑起来看看: