簡體   English   中英

關於C位域的問題

[英]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 

因為ac不連續,所以它們每個都保留了整整int的內存空間。 如果將ac一起移動,則結構的大小將變為8個字節。

此外,要你告訴編譯器a只占據1 ,而不是1個字節。 因此,即使ac彼此僅占3個位(仍然在單個字節以下), ac的組合在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM