8

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

使 std::vector 节省空间的方式(以及是否完全优化)是实现定义的。

这是否意味着它取决于编译器的实现?如果支持,我在哪里可以检查我的编译器是否支持它?他们为什么不希望它得到支持?这似乎是一个非常简单有效的实现。

如果不是,如果我希望进行这种优化,这意味着什么?这意味着什么?

我正在使用 TDM GCC 工具集。

4

3 回答 3

3

实现定义意味着它取决于什么构成抽象机的参数。(IE,定义您的主机操作系统的算法,它们的实现规范和系统调用)。关于“定义的实现”是什么意思的信息问答在这里

如果您有一台带有现代编译器/IDE 的现代机器,它很可能支持实现定义。

如果编译器不支持它,这不太可能是因为他们不“想要”它,而是因为它要么是一个非常古老的编译器,要么是一个资源非常有限的机器。

归结为它依赖于机器;所以不同的操作系统会以自己的方式来完成它。(即,32 位与 64 位等)它不会影响可移植性,除非使用(非常)旧的编译器。如果有问题,您可以检查编译器版本的规范,通过搜索您的编译器及其版本很容易在网上找到。

于 2016-07-11T06:14:54.567 回答
2

正式的语言定义不想排除合理的实现,所以他们总是要小心一点。

例如,典型的调试版本仍然符合标准,但我很可能看到vector<bool>在调试模式下没有被压缩。

现在这不是未指定的,而是实现定义的。这意味着它是否被压缩应该在某个地方的编译器文档中,但标准没有描述文档应该如何组织。

如果您的编译器不支持它,您可以使用另一个库(Boost 是明显的候选者)。vector<bool>通常不是依赖于深度编译器魔法的类,因此替代方案很容易编写。

于 2016-07-11T07:40:29.133 回答
0

它依赖于实现,而不是可移植的。它似乎有一些设计缺陷,你应该避免使用vector<bool>. 您可以从 Meyers 的“Effective STL,item 18”中获得更多详细信息。

如果你真的关心空间效率,你可以std::bitset改用。

于 2016-07-11T05:28:34.863 回答