2014-11-04 82 views
1

我想在我的ARM Cortex M0上使用下面给出的结构。我正在使用C编程。结构与位域,内存分配为阵列

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

flag字段被制成单个逐位字段。上述结构数组的内存分配将如何发生?

作为存储在总内存中的位域,我会受益吗?

+0

没有。物品内存将对齐。 – soerium 2014-11-04 09:04:52

回答

2

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

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

实现可以分配任何可寻址的存储单元大到足以容纳一个比特 字段。

在可寻址存储单元的排列是不确定的。

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

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

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__)),在这个指令会使编译器在分配给这个结构高达该用户使用的内存挤压。

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个字节,回答你的问题。 是使用位域可以节省内存,如上所示。