Amx*_*mxx 1 c++ boolean-operations bit-fields
以下代码无法编译
#include <vector>
int main()
{
std::vector<bool> enable(10);
enable[0] |= true;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
给出错误
no match for ‘operator|=’ (operand types are ‘std::vector<bool>::reference {aka std::_Bit_reference}’ and ‘bool’)
Run Code Online (Sandbox Code Playgroud)
在我的实际代码中,我有一个位域,其中包含我想要|=的函数结果值。
有简单的方法可以表达相同的想法,但是有没有充分的理由使这种运算符不可用?
主要原因是std::vector<bool>很特殊的,并且它的规范特别允许实现以最小化内存使用。
对于除以外的任何矢量bool,引用类型实际上可以是真正的引用(即std::vector<int>::reference实际上可以是int &),通常直接引用矢量本身的元素。因此,对于引用类型,支持基础类型可以进行的所有操作是有意义的。之所以vector<int>可行,是因为有效地管理了int内部的连续数组。除以外的所有类型都一样bool。
但是,为了最大程度地减少内存使用量,a std::vector<bool>可能(实际上可能不会)在内部使用的实际数组bool。相反,它可能使用某些打包的数据结构,例如unsigned char内部数组,其中每个unsigned char都是包含8位的位字段。因此vector<bool>,长度为800的A实际上将管理一个100无符号char 数组,并且它消耗的内存将为100字节(假定没有过度分配)。如果vector<bool>实际包含的数组800 bool,则其内存使用量将为最小800字节(因为sizeof(bool)必须至少1为定义上的值)。
为了允许实现者进行这种内存优化vector<bool>,vector<bool>::operator[](即std::vector<bool>::reference)的返回类型不能简单地是a bool &。在内部,它可能包含对基础类型的引用(例如unsigned char)和跟踪其实际影响位的信息。这将使得所有的运算=符(+=,-=,|=下层类型等)比较昂贵的操作(如位摆弄)。
然后,设计师std::vector<bool>将面临以下选择:
指定std::vector<bool>::reference支持所有操作,=并听到使用这些运算符的程序员不断抱怨运行时效率低下
不要支持那些=认为这样的事情没问题(即使效率低下)的程序员的现场和现场投诉。
似乎std::vector<bool>选择了选项2 的设计者。结果是,所支持的唯一赋值运算符std::vector<bool>::reference是stock标准operator=()(具有类型reference或类型的操作数bool)而不是任何op =。这种选择的优点是,如果尝试执行实际上在实践中不佳的选择,则程序员会遇到编译错误。
毕竟,尽管bool支持=使用它们的所有操作并没有取得太大的成就。例如,some_bool |= true具有与相同的净效果some_bool = true。
| 归档时间: |
|
| 查看次数: |
1449 次 |
| 最近记录: |