2011-06-10 49 views
5

http://www.cplusplus.com/reference/stl/bitset/比特集參考

因爲沒有這樣的小元素類型中最C++環境存在時,各個元件作爲模仿bool元件特殊引用訪問。

這個位參考的確切做法是什麼?

我能想到的唯一方法就是使用靜態數組char s,但每個實例都需要將其索引存儲在數組中。由於每個參考實例的大小至少爲size_t,這會破壞比特集合的緊湊性。此外,調整大小可能會很慢,並且位操作預計會很快。

回答

5

我認爲你混淆了兩件事。

bitset類將比特存儲在緊湊表示中,例如,在char陣列中,通常每char 8位(但是在「異國情調」平臺上的YMMV)。

提供bitset::reference類以允許bitset類的用戶對存儲在bitset中的位具有參考類對象。

由於定期指針和引用不具有足夠的粒度爲指向存儲在bitset(它們的最小粒度是char),例如類模仿了語義到假參考樣左值操作上的基準的單一比特位。這是特別需要的,以允許operator[]返回的值「正常」作爲左值工作(並且可能導致99%的「正常」使用)。在這種情況下,它可以被看作是「代理對象」。

此行爲通過重載賦值運算符和轉換爲bool運算符來實現; bitset::reference類可能會封裝對父對象的引用和引用位的偏移量(字節+位),這些操作符用於檢索和存儲該位的值。

--- --- EDIT

實際上,克++實現使得bitset::reference商店直接的指針,其中該字節被存儲在存儲器字,並且在這樣的字的比特數量。然而,這只是一個提升其性能的實現細節。

順便說一句,在圖書館來源,我發現了什麼bitset::reference非常緊湊,但明確的解釋是什麼,它的作用:

/** 
    * This encapsulates the concept of a single bit. An instance of this 
    * class is a proxy for an actual bit; this way the individual bit 
    * operations are done as faster word-size bitwise instructions. 
    * 
    * Most users will never need to use this class directly; conversions 
    * to and from bool are automatic and should be transparent. Overloaded 
    * operators help to preserve the illusion. 
    * 
    * (On a typical system, this <em>bit %reference</em> is 64 
    * times the size of an actual bit. Ha.) 
    */ 
1

我沒有看過STL源代碼,但我希望Bitset引用包含一個指向實際位集的指針和一個size_t大小的位數。僅當您嘗試獲取對bitset元素的引用時纔會創建引用。

正常使用位集是不太可能廣泛使用引用(如果有的話),所以不應該有太多的性能問題。而且,它在概念上類似於char類型。一個字符通常是8位,但是要存儲一個字符的'引用'需要一個指針,所以通常是32或64位。

0

我從來沒有看的參考實現,但顯然它必須通過引用知道它引用的位集,以及它負責改變的位的索引。然後它可以使用其餘的bitsets接口來進行所需的更改。這可能非常有效。注意位集無法調整大小。

0

我不太清楚你在問什麼,但我可以告訴你一種方法來訪問一個字節中的單個位,這也許是位集合的作用。請注意,以下代碼不是我自己的,並且是Microsoft規範(!)。

創建結構作爲這樣的:

struct Byte 
{ 
    bool bit1:1; 
    bool bit2:1; 
    bool bit3:1; 
    bool bit4:1; 
    bool bit5:1; 
    bool bit6:1; 
    bool bit7:1; 
    bool bit8:1; 
} 

在 ':1' 這個代碼的一部分是位字段。它們定義了一個變量需要佔用多少位,所以在這個結構中,每個佔用1位的有8個bool。總之,'Byte'結構因此是1個字節大小。

現在如果你有數據,諸如炭的字節,則可以在一個字節對象如下存儲這樣的數據:

char a = 'a'; 
Byte oneByte; 
oneByte = *(Byte*)(&a); // Get the address of a (a pointer, basically), cast this 
          // char* pointer to a Byte*, 
          // then use the reference operator to store the data that 
          // this points to in the variable oneByte. 

現在您可以訪問(並改變)通過訪問的各個位oneByte的bool成員變量。爲了重新存放在字符更改後的數據,你可以做如下:

char b; 
b = *(char*)(&oneByte); // Basically, this is the reverse of what you do to 
          // store the char in a Byte. 

我會盡力找到這個技術的來源,給予信貸,信貸到期。

此外,我不能完全確定這個答案是否對您有任何用處。我將你的問題解釋爲'如何訪問單個位在內部處理?'。

+0

問題是關於C++標準庫的'std :: bitset'和'std :: bitset :: reference'類。 – 2011-06-10 14:19:01

+0

@Matteo Italia:我非常瞭解,我解釋了這個問題,好像被問到這些類的訪問是如何在內部實現的。 – Rycul 2011-06-10 14:21:11