可能重复:
'unsigned temp:3' 是什么意思
我正在学习一些内核代码,并遵循以下行(在 linux 2.4,sched.h,struct mm_struct 中):
unsigned dumpable:1;
这是什么意思?
可能重复:
'unsigned temp:3' 是什么意思
我正在学习一些内核代码,并遵循以下行(在 linux 2.4,sched.h,struct mm_struct 中):
unsigned dumpable:1;
这是什么意思?
它是一个位域成员。您的代码意味着dumpable
在结构中恰好占据 1 位。
当您想要以位级别打包成员时,使用位域。当结构中有很多标志时,这可以大大减少使用的内存大小。例如,如果我们定义一个具有 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
# v v
ddddddd ccc
------------------------------------ ------------------------------------
uint32 uint32
b aaaaa
------------------------------------ ------------------------------------
uint32 uint32
因此,您可以通过将许多成员打包在一起来节省空间。
请注意,C 标准没有指定位域在“可寻址存储单元”中的排列或打包方式。此外,与直接成员访问相比,位域更慢。
这意味着它是一个位域——即dumpable 的大小是一个位,您只能为其分配0 或1。通常用于旧代码以节省空间,或用于与硬件接口的低级代码(即使打包是不可移植的)。请参阅此处了解更多信息
如果我没记错的话,当在结构内部使用时,冒号后面的数字表示有多少位组成变量(或位域)。
unsigned dumpable:1;
单个位域也是如此。