從http://www.cplusplus.com/reference/stl/bitset/:比特集參考
因爲沒有這樣的小元素類型中最C++環境存在時,各個元件作爲模仿
bool
元件特殊引用訪問。
這個位參考的確切做法是什麼?
我能想到的唯一方法就是使用靜態數組char
s,但每個實例都需要將其索引存儲在數組中。由於每個參考實例的大小至少爲size_t
,這會破壞比特集合的緊湊性。此外,調整大小可能會很慢,並且位操作預計會很快。
從http://www.cplusplus.com/reference/stl/bitset/:比特集參考
因爲沒有這樣的小元素類型中最C++環境存在時,各個元件作爲模仿
bool
元件特殊引用訪問。
這個位參考的確切做法是什麼?
我能想到的唯一方法就是使用靜態數組char
s,但每個實例都需要將其索引存儲在數組中。由於每個參考實例的大小至少爲size_t
,這會破壞比特集合的緊湊性。此外,調整大小可能會很慢,並且位操作預計會很快。
我認爲你混淆了兩件事。
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.)
*/
我沒有看過STL源代碼,但我希望Bitset引用包含一個指向實際位集的指針和一個size_t大小的位數。僅當您嘗試獲取對bitset元素的引用時纔會創建引用。
正常使用位集是不太可能廣泛使用引用(如果有的話),所以不應該有太多的性能問題。而且,它在概念上類似於char
類型。一個字符通常是8位,但是要存儲一個字符的'引用'需要一個指針,所以通常是32或64位。
我從來沒有看的參考實現,但顯然它必須通過引用知道它引用的位集,以及它負責改變的位的索引。然後它可以使用其餘的bitsets接口來進行所需的更改。這可能非常有效。注意位集無法調整大小。
我不太清楚你在問什麼,但我可以告訴你一種方法來訪問一個字節中的單個位,這也許是位集合的作用。請注意,以下代碼不是我自己的,並且是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.
我會盡力找到這個技術的來源,給予信貸,信貸到期。
此外,我不能完全確定這個答案是否對您有任何用處。我將你的問題解釋爲'如何訪問單個位在內部處理?'。
問題是關於C++標準庫的'std :: bitset'和'std :: bitset :: reference'類。 – 2011-06-10 14:19:01
@Matteo Italia:我非常瞭解,我解釋了這個問題,好像被問到這些類的訪問是如何在內部實現的。 – Rycul 2011-06-10 14:21:11