45

重複の可能性:
「unsigned temp:3」の意味

私はいくつかのカーネルコードを学んでおり、次の行に沿って行きました(Linux 2.4では、sched.h、struct mm_struct):

unsigned dumpable:1;

これは何を意味するのでしょうか?

4

3 に答える 3

58

ビットフィールドメンバーです。あなたのコードは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 標準では、「アドレス指定可能なストレージ ユニット」内でビットフィールドを配置またはパックする方法を指定していないことに注意してください。また、ビットフィールドは直接メンバー アクセスに比べて低速です。

于 2010-07-06T12:06:46.240 に答える
5

これはビットフィールドであることを意味します。つまり、dumpable のサイズは 1 ビットであり、0 または 1 のみを割り当てることができます。通常、スペースを節約するために古いコードで使用されるか、ハードウェアとインターフェイスする低レベルのコードで使用されます (パッキングは移植性がありませんが)。詳しくはこちら

于 2010-07-06T12:07:21.883 に答える
3

私の記憶が正しければ、構造体の中で使用した場合、コロンの後の数字は、変数 (またはビットフィールド) を構成するビット数を表します。

単一unsigned dumpable:1;ビットのビットフィールドも同様です。

于 2010-07-06T12:08:30.053 に答える