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 位)占用,随后的 4 个字节用于 a2。

这种行为是预期的吗?为什么我不能将 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 回答