[英]Declaring a field as a bit (as a single bit, as opposed to a byte multiple) in C#
約瑟夫·阿爾巴哈里和本·阿爾巴哈里(奧萊利)在果殼中的C#6.0。
版權所有2016 Joseph Albahari和Ben Albahari,978-1-491-92706-9。
在第312頁上介紹了BitArrays作為.NET提供的集合類型之一:
BitArray
BitArray是一個動態大小的壓縮bool值集合。 它比bool的簡單數組和bool的泛型List更具內存效率,因為它對每個值只使用一個位,而bool類型則為每個值占用一個字節。
當您只對二進制值感興趣時,有可能聲明一組位而不是使用字節,但是如果聲明單個位字段呢?
喜歡:
public class X
{
public [bit-type] MyBit {get; set;}
}
.NET不支持它嗎?
關於觸摸主題的現有帖子談論設置單個位,最終是一個字節變量。 我問,一旦.NET想到支持使用位變量,在集合中,如果它還支持聲明非集合這樣的變量。
所以你的問題是.NET是否支持這個。 答案是不。
為什么? 從根本上說,有這樣一個功能是可能的。 但需求非常低。 將開發人員的時間投入其他地方更好。
如果你想在字節粒度以下使用內存,你需要自己構建它。 BitArray
不是運行時固有的。 它操縱一些更大類型的位(我認為它是基於int
的)。 你可以做同樣的事情。
BitVector32
是一個內置結構,可用於單獨尋址32位。
正如您在.Net參考中所看到的, BitArray
內部將值存儲在int
Array
中
public BitArray(int length, bool defaultValue) {
...
m_array = new int[GetArrayLength(length, BitsPerInt32)];
m_length = length;
int fillValue = defaultValue ? unchecked(((int)0xffffffff)) : 0;
for (int i = 0; i < m_array.Length; i++) {
m_array[i] = fillValue;
}
_version = 0;
}
因此,使用BitArray分配的最少的東西已經是引用的整個int
,如果將數據存儲在其中則更多。 這也是有意義的,因為用於尋址任何內容的存儲器已經在數據字中。 這些 - 取決於架構 - 至少已經有4個字節。
當然,您可以為要存儲的單個位定義自己的類型,但這也至少需要一個字節 - 如果不是完整的字和由於作為引用類型的字節 - 就這樣做。 操作系統根據內存地址將內存分配給程序,內存地址通常用於尋址字節,因此任何較少的內存都不是完全有用的。
它需要存儲很多二進制值,甚至可以通過首先使用類型來彌補已經丟失的空間,所以這種存儲位技術的唯一真正有用的應用是當你有很多它們時,這樣你就可以獲得8:1的內存比率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.