我想在我的ARM Cortex M0上使用下面給出的結構。我正在使用C編程。結構與位域,內存分配爲陣列
struct path_table_t {
uint8_t lut_index;
uint8_t flag : 1;
};
flag
字段被製成單個逐位字段。上述結構數組的內存分配將如何發生?
作爲存儲在總內存中的位域,我會受益嗎?
我想在我的ARM Cortex M0上使用下面給出的結構。我正在使用C編程。結構與位域,內存分配爲陣列
struct path_table_t {
uint8_t lut_index;
uint8_t flag : 1;
};
flag
字段被製成單個逐位字段。上述結構數組的內存分配將如何發生?
作爲存儲在總內存中的位域,我會受益嗎?
最有可能的是sizeof(struct path_table_t) == 2
。也就是說,有2個元素的結構,每個元素都是8位。 flag
的7位應保持未使用狀態,但仍保留。
請注意,C標準爲編譯器實現提供了很大空間來改變位域所需的大小。例如(N1570,6.7.2.1 P11):
實現可以分配任何可尋址的存儲單元大到足以容納一個比特 字段。
和
在可尋址存儲單元的排列是不確定的。
因此,flag
保留的空間及其填充可能會更大。
如果您想確定,請使用sizeof
檢查尺寸。請記住,更改編譯器或編譯器設置可能會影響結果。
要回答你的問題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__))
,在這個指令會使編譯器在分配給這個結構高達該用戶使用的內存擠壓。
位字段的內存分配是實現定義的。 讓我們考慮您的示例:
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個字節,回答你的問題。 是使用位域可以節省內存,如上所示。
沒有。物品內存將對齊。 – soerium 2014-11-04 09:04:52