一些关于std::vector<bool>的问题

前天写程序需要用到一个可变长度的bool数组,于是很自然地写上std::vector<bool>。后面由于要多线程访问,就用std::vector<bool>::data()方法转了个指针出来,然后gcc就跟我翻脸了……

各种尝试查错的过程就不说了,反正最后结果挺尴尬的:std::vector<bool>这丫的就不是个(纯种的)容器啊!它虽然看起来像,不涉及内存结构的时候用起来也像,但是内部实现并不是往vector里面放一些bool

经这篇文章测试,按操作次数计时,std::vector<bool>的访问效率相比标准std::vector<T>,速度慢了大约40倍。当然,空间也节省了sizeof<T>倍,这个就看取舍了。

然而没有一个内存连续排列的bool容器,有时候毕竟还是不方便。我在做的这个工程恰好已经用到了thrust,一个类似std但支持异构并行的模板库(可以看作是std的并行复刻版),其内部实现中没有对bool特殊关照,直接拿来用就解决了问题。当然如果工程中本来不引用thrust,自然就没必要加这么一个大号依赖了,各显神通咯。