我剛剛看到一段代碼片斷,其中有一段我從未見過的語法。 bool start : 1;
是什麼意思?我在頭文件的類定義中找到它。關於冒號的簡單C++語法問題
回答
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
這是一個位域。 :1表示使用一位。 參見例如http://msdn.microsoft.com/en-us/library/ewwyfdbe(VS.71).aspx
這意味着start
是1個位寬,而不是正常的bool
是1個字節長。您可以將多個較小的變量打包到一個更大的變量中,並且編譯器將生成爲您讀取/寫入所需的所有和/或代碼。你會得到一個(明顯的)性能影響,但是如果使用得當,你會使用更少的內存。
它使成員start
成爲一個位域,保留1位空間。
它只對struct/class成員有效,你不能有一個位域變量。
請參閱維基百科條目Bit Fields。它告訴編譯器結構成員應該佔用多少位。
語法本質上講,你在結構中定義一個字段只具有一個完整的字節或短或整型數位。
幾個位字段可能共享同一個int,所以這個方法可以用作一種聰明的方式來避免構造值時的一些位操作。
這是一個bit-field。但我從來沒有嘗試過在布爾上做位字段。
這是用於描述bit fields的語法。這是將更多信息包裝到少量存儲中的一種方式。通常情況下,bool至少需要一個字節(可能更多)來表示,通過使用位域,可以用簡單的語法將多個bool組合成一個字節。
但要小心。作爲該語言中鮮爲人知的領域之一,您可能會在使用它們時遇到拐角案例。例如,這樣產生的數據結構可能在處理器類型之間不可移植。
- 1. 簡單的問題關於IF語句
- 2. 關於C++的簡單一般問題
- 3. 關於Memset的簡單問題C
- 4. MySQL簡單/雙引號語法問題
- 5. 簡單的問題關於C#if else語句
- 6. 簡單的語法問題
- 7. 關於GetElementsByTagName的CLR C++語法問題
- 8. 關於C語法的一些問題
- 9. 關於C++的語法問題
- 10. 簡單的問題關於簡單的數組Objective-C
- 11. php語法簡單問題
- 12. C/C++單冒號
- 13. 問題有關C語法
- 14. 在CSS語法中雙冒號(::)對單冒號(:) :)
- 15. 是否縮短問號冒號?:一個Objective-C語法?
- 16. 關於軌道中的符號的簡單問題
- 17. 關於CGRectIntersectsRect的簡單問題
- 18. 關於JTextArea的簡單問題
- 19. 關於聚合物的簡單問題
- 20. 關於LINQ的簡單問題
- 21. 關於ActiveRecord協會的簡單問題
- 22. 關於java的簡單問題SimpleDateFormat
- 23. 關於MVC的簡單問題
- 24. 關於指針的簡單問題
- 25. 關於java同步的簡單問題
- 26. 一個簡單的問題關於iAd
- 27. 關於簡單授權的問題
- 28. 關於LINQ to SQL的簡單問題
- 29. 簡單IRB關於計數的問題
- 30. 關於isset的簡單問題($ _ POST ['submit'])
表現什麼?我假設編譯過程變慢了(這不應該是一個問題,恕我直言),但是運行時性能是否也會下降? – Oxymoron 2010-02-10 08:31:46
是的,在運行時,您對此變量(讀取或寫入)的每次訪問必須轉換爲位級訪問。例如,如果您閱讀其中一項內容,您首先必須將大字段加載到寄存器中,並將其與掩碼進行AND運算,然後向右移位,這比正常讀取速度至少慢3倍。寫作也一樣。 – Blindy 2010-02-10 20:39:33
跨界位域變得更糟,它們必須合併,使工作量增加一倍(如果它們不是完全被忽略)。 – Blindy 2010-02-10 20:40:25