在C中,冒号在一个声明中意味着什么?
可能重复:
什么是'unsigned temp:3'的意思
我正在学习一些内核代码,并沿着下面的行(在Linux 2.4中,sched.h,struct mm_struct):
unsigned dumpable:1;
这是什么意思?
这是一个位域成员。 你的代码意味着dumpable
在结构中占据1位。
当您想要在比特级中打包成员时使用位域。 当结构中有很多标志时,这可以大大减less使用的内存的大小。 例如,如果我们定义一个具有4个已知数字约束成员的结构体
0 < a < 20 b in [0, 1] 0 < c < 8 0 < d < 100
那么结构可以被声明为
struct Foo { unsigned a : 5; // 20 < 2^5 = 32 unsigned b : 1; // unsigned c : 3; // unsigned d : 7; // 100 < 2^7 = 128 };
那么Foo的位可以像这样排列
ddddddd c cc b aaaaa --------- --------- --------- ---------- octet 1 octet 0 =========================================== uint32
代替
struct Foo { unsigned a; unsigned b; unsigned c; unsigned d; };
由于值的范围,许多位被浪费了
# wasted space which is not used by the program # vv ddddddd ccc ------------------------------------ ------------------------------------ uint32 uint32 b aaaaa ------------------------------------ ------------------------------------ uint32 uint32
所以你可以通过包装很多成员来节省空间。
请注意,C标准没有指定位域如何排列或打包在“可寻址存储单元”中。 而且,与直接成员访问相比,位域速度较慢。
这意味着它是一个位域 – 也就是说,可抽取的大小是一个单一的位,你只能分配0或1。 通常用于旧代码以节省空间,或用于与硬件接口的低级代码(即使包装不可移植)。 在这里看到更多的信息
如果我没有记错的话,当在结构中使用时,冒号后面的数字表示variables(或位字段)有多less位组成。
所以unsigned dumpable:1;
是一个单比特的比特字段。