“ int kind:19;”是什么意思?

时间:2019-02-20 18:13:47

标签: c

我看到类似int kind : 19;的字样。我不熟悉这种语法。有人能让我知道这是什么意思吗?谢谢。

struct _jit_type
{
    unsigned int ref_count;
    int          kind         : 19;
    int          abi          : 8;
    int          is_fixed     : 1;
    int          layout_flags : 4;
    jit_nuint    size;
    jit_nuint    alignment;
    jit_type_t   sub_type;
    unsigned int num_components;
    struct jit_component components[1];
};

http://git.savannah.gnu.org/cgit/libjit.git/tree/jit/jit-internal.h#n784

1 个答案:

答案 0 :(得分:0)

int kind : 19;

平均19位用于记忆种类,是位字段

这可以减少内存(堆或堆栈)的消耗,例如,如果之前或之后的其他字段位于13位上,则它们都可以使用32位(取决于其他字段,对齐方式等)

示例

struct S1 {
   int kind : 19;
   int value : 13;
};
struct S2 {
   int kind ;
   int value;
};

如果 int 使用32位,则sizeof(struct S2)为8,而sizeof(struct S1)为4


有局限性:

例如,您无法获得位字段的地址:

struct S1 s1;
int * p = &s1.kind;

产生编译器错误cannot take address of bit-field ‘kind’,这是因为类型int:19不存在,并且将字段 kind 的地址用作 int * 当然是没有道理的。

并作为EugeneSh。在一句话中说,您无法获得位域的 sizeof ,因为 sizeof 的统一性是char的大小( sizeof(char)为1(按定义)),所以

sizeof(s1.kind)

产生编译器错误‘sizeof’ applied to a bit-field