我想在ARM Cortex M0上使用下面给出的结构。我正在使用C编程。
struct path_table_t {
uint8_t lut_index;
uint8_t flag : 1;
};
flag
字段是逐位字段。如何对上述结构的数组进行内存分配?
我是否可以将位字段的好处保存为总内存?
答案 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个字节,可以回答您的问题。
是的,使用位字段可以节省内存,如上所示。