2011-06-10 77 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