[英]Questions about C bitfields
位域是C概念還是C ++?
只能在結構內使用嗎? 我們還能在其他地方使用它們嗎?
AFAIK,位域是特殊的結構變量,僅在指定編號時占用內存。 位。 這對節省內存很有用,僅此而已。 我對么?
我編寫了一個小程序來了解位域的用法-但是,我認為它無法按預期工作。 我希望以下結構的大小為1 + 4 + 2 = 7個字節(考慮到我的機器上unsigned int的大小為4個字節),但令我驚訝的是,結果卻是12個字節(4 + 4 + 4 )。 誰能讓我知道為什么?
#include <stdio.h>
struct s{
unsigned int a:1;
unsigned int b;
unsigned int c:2;
};
int main()
{
printf("sizeof struct s = %d bytes \n",sizeof(struct s));
return 0;
}
輸出:
sizeof struct s = 12 bytes
因為a
和c
不連續,所以它們每個都保留了整整int的內存空間。 如果將a
和c
一起移動,則結構的大小將變為8個字節。
此外,要你告訴編譯器a
只占據1 位 ,而不是1個字節。 因此,即使a
和c
彼此僅占3個位(仍然在單個字節以下), a
和c
的組合在32位計算機上的內存中仍會按字對齊,因此占用了4個字節除了int b
。
同樣,您會發現
struct s{
unsigned int b;
short s1;
short s2;
};
占用8個字節,而
struct s{
short s1;
unsigned int b;
short s2;
};
占用12個字節,因為在后一種情況下,兩個短褲各自以自己的32位對齊方式放置。
1)它們起源於C,但是不幸的是它們也是C ++的一部分。
2)是,或者在C ++中的類中。
3)除了節省內存外,它們還可以用於某些形式的位旋轉。 但是,內存節省和混亂都本質上取決於實現-如果您要編寫可移植軟件,請避免使用位字段。
C.
您的編譯器已將內存分配四舍五入為12個字節,以用於對齊目的。 大多數計算機內存系統不能處理字節尋址。
您的程序運行完全符合我的期望。 編譯器將相鄰的位域分配到相同的存儲字中,但是您的位由非位域分隔。
將位域彼此相鄰移動,您可能會得到8,這是計算機上兩個整數的大小。 這些位字段將打包為一個int。 但是,這是特定於編譯器的。
位域對於節省空間很有用,但別無其他。
位域在固件中廣泛用於映射寄存器中的不同域。 這樣可以節省大量手動的按位操作,而沒有它們則需要讀/寫字段。 缺點之一是您無法獲取位域的地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.