具有位域的结构,用于阵列的存储器分配

时间:2014-11-04 08:58:54

标签: c

我想在ARM Cortex M0上使用下面给出的结构。我正在使用C编程。

struct path_table_t {
    uint8_t lut_index;
    uint8_t flag : 1;
};

flag字段是逐位字段。如何对上述结构的数组进行内存分配?

我是否可以将位字段的好处保存为总内存?

3 个答案:

答案 0 :(得分:2)

最有可能是sizeof(struct path_table_t) == 2。也就是说,具有2个元素的结构,每个元素是8位。 flag的7位应保持未使用状态,但仍保留。

请注意,C标准为编译器实现提供了很大的空间来改变位字段所需的大小。例如(N1570,6.7.2.1 p11):

  

实现可以分配任何足够大的可寻址存储单元来保存位 -   字段。

  

未指定可寻址存储单元的对齐方式。

因此flag及其填充所保留的空间可能更大。

如果您想确定,请使用sizeof检查尺寸。请记住,更改编译器或编译器设置可能会影响结果。

答案 1 :(得分:1)

回答你的问题
Will I get the benefit of bit fields as saving in total memory?
NO

考虑两个结构的

struct path_table1_t {
    uint8_t lut_index;
    uint8_t flag : 1;
}a;

struct path_table2_t {
    uint8_t lut_index;
    uint8_t flag;
}b;

sizeof(a)sizeof(b) 相等

但是如果您计划使用给定位字段中的所有位,则会减少分配的内存。像

struct path_table3_t {
    uint8_t lut_index : 1;
    uint8_t flag : 1;
}c;

在这种情况下,sizeof(c)是sizeof(uint8_t),它将是1个字节。 总结一下:
sizeof(c) < sizeof(a)sizeof(a) = sizeof(b)

如果您对保存内存非常感兴趣,请使用关键字__attribute__((__packed__)),其中该指令将使编译器挤入为此结构分配的内存,用户正在使用。

答案 2 :(得分:0)

位字段的内存分配是实现定义的。 让我们考虑你的例子:

struct path_table_t {
   uint8_t lut_index;
   uint8_t flag : 1;
};

int main()
{
   struct path_table_t p;

   printf("%d\n",sizeof(p));
}

这里你需要9位的使用,所以它将被填充到2个字节。

如果你的结构是

struct path_table_t {
   uint8_t lut_index : 1;
   uint8_t flag : 1;
};

int main()
{
   struct path_table_t p;

   printf("%d\n",sizeof(p));
}

您在此处看到只需要2位,因此您的sizeof(struct)将是1个字节,可以回答您的问题。 是的,使用位字段可以节省内存,如上所示。