今天 ,写代码的时候我想用一个数组把布尔值存起来,就像这样:
vector<bool> a;
if (isOrder(num)) {
a.push_back(true);
}
然后取他的一个元素的地址时:
bool* ptr = &a[0];
就出现了编译错误:
error C2440: “初始化”: 无法从“std::_Vb_reference<std::_Wrap_alloc<std::allocator<_Other>>> *”转换为“bool *”
note: 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
什么意思呢?
我查阅了文档,了解到在容器里C++标准对于vecotr<bool>值有其特殊的实现方法。目的是为了减小空间的耗用。一个bool值的存储其实只用了1位,也就是说要八个bool值才刚好是一个字节。而且由于vector<bool>逐位进行存取访问,所以访问速度通常比int之类的普通类型操作要慢很多。那么为什么其实如果不取地址的话话说可以编译成功的,那么为什么取地址以后就失败了呢?
我查阅到了这样一段话:
是的他是通过一种叫代理对象(proxy object)的方法来实现的,他不是一个标准容器,只是一个近似于容器的存在。
所以对于这种情况,我们应该尽量避免其发生,特别是算法中会否有对vecotr地址进行解引用操作的可能。
我们不建议这样使用vector,而应该使用unsigned char这样来代替。