我正在学习一些内核代码,在 Linux 2.4 中遇到了以下行(在 sched.h 文件的 struct mm_struct 结构体中):
unsigned dumpable:1;
这意味着什么?我正在学习一些内核代码,在 Linux 2.4 中遇到了以下行(在 sched.h 文件的 struct mm_struct 结构体中):
unsigned dumpable:1;
这意味着什么?这是一个位域成员。你的代码意味着dumpable
在结构体中占用了1个bit。
当您想将成员打包到位级别时,可以使用位域。 当结构中有许多标志时,这可以大大减少所使用的内存大小。 例如,如果我们定义一个具有已知数字约束的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的位(bits)可能会排列如下:
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;
是一个只有一位的位域。