簡體   English   中英

位結構域

[英]Bit-Sized structure field

我有兩個問題:

這段代碼:

   struct employee
   {
      char name[20];
      int married :1;
   };

已婚的人要記多少次?

如果我有多個位大小的字段,將它們放在相同的變量中以保持它們的獨立性是否很好?

喜歡:

struct employee
{
 char name[31];
 int married :1;
 int manager :2;
 int children :4;
};

要么

struct employee
{
 char name[31];
 int flage; /* one bit for married, one for manager, and 4 bits for children */
};

哪一個在內存使用方面更好,為什么?

已婚的人要記多少次?

int : 1sizeof(int)的存儲單元中占用一位內存。 請注意,因為int是帶符號的,並且位域只有一位,所以這樣的位域只能采用兩個值:-1和0。

這取決於編譯器,還可能取決於您在構建時為編譯器提供的選項。

緊密打包字段可能會降低訪問性能,同時提高存儲效率,因此,如果您告訴編譯器進行速度優化,則它可能會更改。

位域在內存中永遠不能占用少於CHAR_BITS位,因為否則每個struct實例的起始地址都不會落在確切的char地址上,而必須這樣做。

所以第一個例子:

struct employee
{
    char name[20];
    int married :1;
};

假設您的系統上的sizeof (int)為4,則可能意味着sizeof (struct employee)占用了24個字節。 這意味着,如果您在married后添加了更多的位域成員,則大小不會改變,直到您添加了31位的域。

當您使用int flage存儲有關已婚經理和子女的信息時,可能為一個對象占用2個字節的內存 ,並且每次您必須訪問特定信息時,都必須flage變量執行按位運算 因此,這將需要一些處理。

通過使用位域,例如int married:1; (最好使用unsigned int ),這意味着它可能只占用1個字節的內存 ,因此可以節省內存(假設您的結構未填充)。 另外,您可以直接訪問其位

因此,對於內存和處理,這應該是更好的方法。

選擇最容易閱讀的哪個,最准確地抓住您的編碼意圖。 這種微優化的說法是完全不合適的。 如果您處於性能至關重要的內部循環中,則可能會變得很重要,但是隨后其他技術(例如算法),CPU的緩存性能,循環展開,循環流水線處理等也會影響到其他技術。

只是重申一下:將要閱讀您的代碼的人的代碼。

您甚至可能會考慮以下內容:

struct employee
{
    char name[31];
    bool married;
    enum manager_t manager;
    ...
};

如果您嘗試將bool (例如)分配給employee::manager ,編譯器會在此處警告您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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