std::vector<bool> 优化实现

9
文档中,我看到std::vector<bool>通过使每个布尔值占用一个位来优化空间效率。从文档中可以看出:

std::vector如何实现空间效率(以及是否进行了优化)是实现定义的。

这是否意味着它取决于编译器的实现?如果是这样,我在哪里可以检查我的编译器是否支持它?为什么他们不希望支持它?这似乎是一种非常简单和有效的实现。
如果不是这样,那么这意味着什么,如果我想进行此优化,会有什么影响?
我正在使用TDM GCC工具集。

1
是的,这意味着 std::vector<bool> 的实现在很大程度上取决于编译器。它可能根本没有被优化,或者它可能以一种特定于实现的方式进行了优化。通常,您可以通过查阅编译器文档来了解这一点。对于GCC和其他开源工具链,我想您也可以查阅源代码。但这不仅需要更多的工作,而且可能不是一个很好的主意,因为源代码只记录了实现,而不是契约。 - Cody Gray
1
检查这种优化是否提供的简单方法是检查 std::vector<bool>::reference_type 是否为 bool & 还是其他类型。如果是后一种情况,则您有一个代理类型,这应该仅允许用于“优化”的实现。 - Matteo Italia
1
即使实现不会压缩位,也需要将std::vector<bool>::reference定义为代理。 - T.C.
标准化的std::vector<bool>专业化被社区普遍认为是一种错误。如果您正在寻找一组标准化的位集合,那么我认为考虑使用std::bitset是明智的选择。 - Richard Hodges
1
一个相关的问题是 https://dev59.com/m23Xa4cB1Zd3GeqPcDM2 - manlio
3个回答

3
Implementation defined的意思是它取决于抽象机器参数的构成。也就是说,取决于定义主机操作系统、实现规范和系统调用的算法。关于"implementation defined"的详细问答内容请参考此处
如果您使用的是现代化的计算机和编译器/集成开发环境,很可能支持implementation definition。
如果某个编译器不支持它,这很可能并不是因为他们不想支持,而是因为它是一个非常老的编译器,或者所在的机器资源非常有限。
总结一下,这是与机器相关的;因此,不同的操作系统将以自己的方式处理它(例如32位与64位)。除非使用非常旧的编译器,否则这不会影响可移植性。如果担心这个问题,可以查看编译器版本的说明书,通过在线搜索您的编译器及其版本即可轻松找到。

2
正式的语言定义不想排除合理的实现,因此它们总是需要小心谨慎。
例如,典型的调试构建仍然符合标准,但我很可能会看到在调试模式下未压缩vector<bool>
现在这不是未指定的,而是实现定义的。这意味着它是否被压缩应该在编译器文档中说明,但标准没有描述文档应该如何组织。
如果您的编译器不支持您想要的功能,则可以使用另一个库(Boost是显而易见的选择)。 vector<bool>通常不是依赖于深度编译器魔法的类,因此编写替代方案很容易。

0

这是实现相关的,不具备可移植性。它似乎存在一些设计缺陷,应该避免使用vector<bool>。您可以从Meyers的“Effective STL,item 18”中获取更多详细信息。

如果您真的关心空间效率,可以使用std::bitset代替。


不幸的是,我不能使用 std::bitset,因为我需要动态初始化。 - Simon
5
值得一提的是,Boost库有一个dynamic_bitset,但有时候使用Boost可能会过于复杂。如果你知道如何使用它,std::vector<bool>也不错,毕竟像某些人指出的那样。 - legends2k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接