如何检查是否矢量 实际上是比特,而不是字节的向量?(How do I check if vec

2019-07-18 05:21发布

我需要存储位的动态数组。
上矢量<布尔>的C ++参考页面有以下信息:

存储不一定是数组bool值,但是,使每个值存储在一个单个位库实现可以优化存储。

我如何确保我的程序使用vector<bool>做其实店里位向量,而不是布尔值(字节)?

Answer 1:

不要尝试这样做。 相反,使用boost::dynamic_bitset这清楚地表明你真正想要的东西。 该vector<bool>使用迭代时(因为它通常返回代理对象)优化实际上创建用于错误多种可能性,例如。



Answer 2:

嗯,你总是可以考虑来与你的编译器的头文件。 由于STL容器几乎都是模板类,大多数,如果不是执行所有部分将在标题可见。

也许寻找一个vector在调试对象也可以是有帮助的。

注意:您也应该知道, vector<bool>的同时,而在由C ++社区皱起了眉头,而这种优化是大小,不求速度:

https://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=98



Answer 3:

有可能在编译时检查这一点,通过检查的非const版本的返回类型vector<bool>::operator[]存储其值作为比特的实现必须返回一个代理引用类而比bool&



Answer 4:

没什么好说的都在这里进行检查。 专业化vector<bool>来存储比特,而不是较大的物体是由标准所要求的。 §23.2.5:“为了优化空间分配,载体为布尔元素的特化提供了:”。

我从一些观点想,你已经报价至少排序是正确的。 由于基本上是有没有人来证明一个编译器的一致性,并且基本上没有编译器,甚至试图满足所有的一致性要求,编译器可以选择忽略此要求也是如此。

我不知道这样做,但任何编译器 - 如果有人这样做,我猜它可能会相当知名。 已经有在时间有关删除相当热烈讨论vector<bool>专业化,所以如果有人想了的是如何使事情更好(或更糟),我怀疑现实生活中的例子我们就已经听说了。

编辑:在C ++ 11,对于要求std::vector<bool>已经被转移到§23.3.7。 更重要的是,措词已经被改变,以指定每个填充表示bool被存储为单个位的,而不是一个连续分配bool值现在只有一个建议。

至少IMO,这使得几乎没有真正的区别。 据我所知,所有真正的实现仍然使用打包表示,因此,即使打包的存储不再是理论上的保证,它在实践中发生的反正。



Answer 5:

这个程序种prooves它。

#include <vector>
#include <iostream>

template <typename T>
void showSize() {
    std::vector<T> myvec;
    size_t capacity = myvec.capacity();
    std::cout << "capacity: " << myvec.capacity() << std::endl;
    std::cout << "size: " << myvec.size() << std::endl;
    while (myvec.capacity() < 1024) {
        while (myvec.capacity() == capacity) {
            myvec.push_back(T());
        }
        capacity = myvec.capacity();
        std::cout << "capacity: " << myvec.capacity() << std::endl;
        std::cout << "size: " << myvec.size() << std::endl;
    }

}

int main(int, char**) {
    std::cout << std::endl << std::endl;
    std::cout << "*********************" << std::endl << std::endl;
    std::cout << "Booleans: " << std::endl << std::endl;
    showSize<bool>();
    std::cout << std::endl << std::endl;
    std::cout << "*********************" << std::endl << std::endl;
    std::cout << "Chars: " << std::endl << std::endl;
    showSize<char>();
}

输出:

*********************

Booleans: 

capacity: 0
size: 0
capacity: 64
size: 1
capacity: 128
size: 65
capacity: 256
size: 129
capacity: 512
size: 257
capacity: 1024
size: 513


*********************

Chars: 

capacity: 0
size: 0
capacity: 1
size: 1
capacity: 2
size: 2
capacity: 4
size: 3
capacity: 8
size: 5
capacity: 16
size: 9
capacity: 32
size: 17
capacity: 64
size: 33
capacity: 128
size: 65
capacity: 256
size: 129
capacity: 512
size: 257
capacity: 1024
size: 513

所以关键是,对布尔变量的能力提高了64个项目在同一时间(INT的大小或我的机器)。 这暗示,它只是保留在同一时间只有8个字节。



Answer 6:

创造了巨大的vector<bool>和查看程序的内存使用情况。

或者干脆退房的源代码-你可以在偷看vector头。



文章来源: How do I check if vector is actually a vector of bits and not bytes?