簡體   English   中英

在C#中將字段聲明為一個位(作為單個位,而不是字節倍數)

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

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