web-dev-qa-db-ja.com

Cでは、宣言の中でコロンはどういう意味ですか?

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

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

unsigned dumpable:1;

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

42
Tzafrir

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

56
kennytm

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

5
Airsource Ltd

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

そう unsigned dumpable:1;は単一ビットのビットフィールドです。

3
Justin Niessner