重複の可能性:
「unsigned temp:3」の意味
私はいくつかのカーネルコードを学習していて、次の行に沿って来ました(Linux 2.4では、sched.h、struct mm_struct):
unsigned dumpable:1;
これは何を意味するのでしょうか?
bitfield メンバーです。あなたのコードは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標準では、ビットフィールドが「アドレス指定可能なストレージユニット」内でどのように配置またはパックされるかは指定されていないことに注意してください。また、ビットフィールドは、メンバーへの直接アクセスに比べて遅くなります。
これはビットフィールドであることを意味します。つまり、ダンプ可能ファイルのサイズは1ビットであり、0または1しか割り当てることができません。通常は、スペースを節約するための古いコード、またはハードウェアとインターフェースする低レベルのコードで使用されます(パッキングは移植不可能ですが)。詳細は こちら を参照してください
私の記憶が正しければ、構造体の中で使用した場合、コロンの後の数値は、変数(またはビットフィールド)を構成するビット数を示します。
そう unsigned dumpable:1;
は単一ビットのビットフィールドです。