1

次の 2 つの構造では、

typedef struct _a {
    short a1:13 __attribute__((packed));
    char a2[4]  __attribute__((packed));
} a;

typedef struct _b {
    short b1:10 __attribute__((packed));
    short b2:10 __attribute__((packed));
    short b3:12 __attribute__((packed));
} b;

ではstruct b、b2 のビットが b1 でパックされ、b3 のビットが b2 でパックされていることがわかります。最終的には 4 バイト値になります。

と同様の動作を期待していましたstruct aが、同じではありません。最初の 2 バイトは a1 (未使用の 5 ビット) で占められ、その後に a2 の 4 バイトが続きます。

この動作は予期されたものですか? char[4] を short:13 と一緒にパックできないのはなぜですか? それを達成する方法はありますか?

4

2 に答える 2

8

a2はビットフィールドではないため、と一緒に配置されることはありませんa1。標準は言う

他のオブジェクトタイプの非ビットフィールドオブジェクトに格納される値は、n×CHAR_BITビットで構成されます。ここで、nはそのタイプのオブジェクトのサイズ(バイト単位)です。値は、unsigned char [n]型のオブジェクトにコピーできます(たとえば、memcpyによって)。結果として得られるバイトのセットは、値のオブジェクト表現と呼ばれます。

したがって、そのようなサブオブジェクトはアドレス可能なユニットである必要があり、そのルールから可能な例外はありません。

于 2012-12-06T08:01:41.500 に答える
1

(コメントするには長すぎるので、答えとして入れます)

すべてのフィールドをまとめてパックするには、配列を4つのフィールドに置き換える必要があります。

typedef struct _a {
    short a1:13 __attribute__((packed));
    char a2_0:8 __attribute__((packed));
    char a2_1:8 __attribute__((packed));
    char a2_2:8 __attribute__((packed));
    char a2_3:8 __attribute__((packed));
} a;
于 2012-12-06T08:52:29.613 に答える