2013-02-28 71 views
1

任何编译器专家都能评论有效使用布尔值吗?具体而言,编译器是否能够优化std::vector<boolean>以使用最少的内存?是否有一个等效的数据结构?在C++中有效地使用布尔值true和false?

当天有些编译器的语言可以将布尔值数组压缩为每个布尔值仅表示一位的值。对于C++来说,最好的做法是使用std::vector<char>来存储布尔值以减少内存使用量?

这里的用例将存储数以百万计的布尔值,其中单个字节将节省大量的空间,每个值超过4个或更多字节,单个位甚至更多。

+4

'矢量'很奇怪(至少与其他类型的矢量相比),但是它是“矢量”的专门化,因此被区别对待。 – chris 2013-02-28 03:28:08

回答

1

std :: vector for bool是一个模板专门化,它可以满足您的要求。

您可以阅读更多here

您可能还想探索标准bitset

0

在被普遍认为是标准缺陷的部分,std::vector专门用一位来表示每个值。

如果这恰好是您正在寻找的东西,那么就使用它。

+0

标准实际上并不要求这个,但是,它呢? – jogojapan 2013-02-28 03:30:52

+0

@jogojapan:你说得很对,它不是*必填*,但没有优化。 – Mankarse 2013-02-28 03:32:19

+0

为什么它是一个缺陷,但?如果它不是必需的,它为什么会在标准中出现,因为它无论如何都像矢量本身一样走路和说话? – 2013-02-28 03:33:21

5

参见std::vector

专业化

标准库提供STD为bool类型,这是对于空间效率优化的专业化::矢量。
矢量<布尔>空间有效动态位集 (类模板特)

和从 “运行的C++草案,2012年11月2日”

23.3.7类矢量[向量.bool]
1为了优化空间分配,提供了用于布尔元素的矢量专业化:
template < class Allocator> class vector <布尔,分配器> {
...
}

3没有该数据被存储为布尔值的连续分配的要求。建议使用空间优化的比特表示。

因此,没有要求,但只建议将bool值存储为位。

0

作为一种保证高效存储的标准不可知的方式,您可以创建自己的Bitvector类。基本上每8 bool值你只需要分配一个char,然后你可以将每个bool存储在一个位。然后,您可以使用访问器/增变器中的位移技术来存储/检索您的各个位。

一个这样的例子在Ron Penton和AndréLaMothe的Data Structures for Game Programmers(我也推荐作为一般数据结构参考)中概述。虽然我没有详细地搜索过,但写出自己的代码并不难,但互联网上可能还有其他一些例子。

1

请注意,vector<bool>不是一个容器,但它伪装成一个并提供迭代器。 有一天,如果您像普通容器一样对待它,可能会导致混淆和错误,例如,试图获得元素的地址。

如果您需要为每个布尔值存储1位,您可能会考虑std::bitsetboost::dynamic_bitset。这些数据结构不会伪装成容器,因此使用它们时不太可能出现错误,特别是在模板代码中。

相关问题