2010-02-10 40 views

回答

20
struct record { 
    char *name; 
    int refcount : 4; 
    unsigned dirty : 1; 
}; 

那些是位域;該數字給出了字段的確切大小,以位爲單位。 (有關詳細信息,請參見有關C的完整書籍。)位域可用於節省具有多個二進制標誌或其他小型域的結構中的空間,並且還可用於嘗試符合外部施加的存儲佈局。 (他們在後一項任務中的成功可以通過位字段在某些機器上從左到右並從右到左分配的事實來緩解。

請注意,用於以位爲單位指定字段大小的冒號表示法僅在結構體(和聯合體)中有效;您不能使用此機制來指定任意變量的大小。

  • 參考文獻:K & R1 Sec。 6.7 pp。136-8
  • K & R2 Sec。 6.9 pp。149-50
  • ISO Sec。 6.5.2.1
  • H & S Sec。 5.6.5第136-8
4

這意味着start是1個位寬,而不是正常的bool是1個字節長。您可以將多個較小的變量打包到一個更大的變量中,並且編譯器將生成爲您讀取/寫入所需的所有和/或代碼。你會得到一個(明顯的)性能影響,但是如果使用得當,你會使用更少的內存。

+0

表現什麼?我假設編譯過程變慢了(這不應該是一個問題,恕我直言),但是運行時性能是否也會下降? – Oxymoron 2010-02-10 08:31:46

+0

是的,在運行時,您對此變量(讀取或寫入)的每次訪問必須轉換爲位級訪問。例如,如果您閱讀其中一項內容,您首先必須將大字段加載到寄存器中,並將其與掩碼進行AND運算,然後向右移位,這比正常讀取速度至少慢3倍。寫作也一樣。 – Blindy 2010-02-10 20:39:33

+0

跨界位域變得更糟,它們必須合併,使工作量增加一倍(如果它們不是完全被忽略)。 – Blindy 2010-02-10 20:40:25

3

它使成員start成爲一個位域,保留1位空間。

它只對struct/class成員有效,你不能有一個位域變量。

4

請參閱維基百科條目Bit Fields。它告訴編譯器結構成員應該佔用多少位。

2

這是bit fields

語法本質上講,你在結構中定義一個字段只具有一個完整的字節或短或整型數位。
幾個位字段可能共享同一個int,所以這個方法可以用作一種聰明的方式來避免構造值時的一些位操作。

1

這是一個bit-field。但我從來沒有嘗試過在布爾上做位字段。

2

這是用於描述bit fields的語法。這是將更多信息包裝到少量存儲中的一種方式。通常情況下,bool至少需要一個字節(可能更多)來表示,通過使用位域,可以用簡單的語法將多個bool組合成一個字節。

但要小心。作爲該語言中鮮爲人知的領域之一,您可能會在使用它們時遇到拐角案例。例如,這樣產生的數據結構可能在處理器類型之間不可移植。