std::vector<bool>优化实现
std::vector<bool> optimization implementation
在 documentation 中,我可以看到 std::vector<bool>
通过使每个布尔值占用一位来针对 space 效率进行了优化。来自文档:
The manner in which std::vector is made space efficient (as well as whether it is optimized at all) is implementation defined.
这是否意味着它取决于编译器的实现?
如果支持,我在哪里可以检查我的编译器是否支持它?他们为什么不希望它得到支持?这似乎是一个非常简单有效的实现。
如果不是,这意味着什么?如果我希望进行此优化,它又意味着什么?
我正在使用 TDM GCC 工具集。
它依赖于实现,并且不可移植。它似乎有一些设计缺陷,你应该避免使用 vector<bool>
。您可以从 Meyers 的 "Effective STL, item 18".
中获得更多详细信息
如果你真的很关心 space-效率,你可以使用 std::bitset
。
实现定义意味着它取决于构成抽象机参数的内容。 (即定义主机操作系统的算法、它们的实现规范和系统调用)。关于“实现定义”的含义的信息性问答是 here。
很有可能,如果您有一台带有现代 compiler/IDE 的现代机器,它支持实现定义。
如果编译器不支持它,那不太可能是因为他们不 "want" 它,而是因为它要么是一个非常古老的编译器,要么是一台资源非常有限的机器。
归结为它依赖于机器;因此不同的操作系统将以自己的方式处理它。 (即 32 位与 64 位等)它不会影响可移植性,除非使用(非常)旧的编译器。如果有问题,您可以检查编译器版本的规格,通过搜索您的编译器及其版本可以轻松在网上找到。
正式的语言定义不想排除合理的实现,所以他们总是要小心一点。
例如,典型的调试版本仍然符合标准,但我很清楚 vector<bool>
未在调试模式下压缩。
现在这不是未指定,而是实现已定义。这意味着它是否被压缩的事实应该在某个地方的编译器文档中,但标准没有描述文档应该如何组织。
如果您的编译器不支持它,您可以使用另一个库(Boost 是显而易见的候选者)。 vector<bool>
通常不是 class,它依赖于深度编译器魔法,因此替代方案很容易编写。
在 documentation 中,我可以看到 std::vector<bool>
通过使每个布尔值占用一位来针对 space 效率进行了优化。来自文档:
The manner in which std::vector is made space efficient (as well as whether it is optimized at all) is implementation defined.
这是否意味着它取决于编译器的实现? 如果支持,我在哪里可以检查我的编译器是否支持它?他们为什么不希望它得到支持?这似乎是一个非常简单有效的实现。
如果不是,这意味着什么?如果我希望进行此优化,它又意味着什么?
我正在使用 TDM GCC 工具集。
它依赖于实现,并且不可移植。它似乎有一些设计缺陷,你应该避免使用 vector<bool>
。您可以从 Meyers 的 "Effective STL, item 18".
如果你真的很关心 space-效率,你可以使用 std::bitset
。
实现定义意味着它取决于构成抽象机参数的内容。 (即定义主机操作系统的算法、它们的实现规范和系统调用)。关于“实现定义”的含义的信息性问答是 here。
很有可能,如果您有一台带有现代 compiler/IDE 的现代机器,它支持实现定义。
如果编译器不支持它,那不太可能是因为他们不 "want" 它,而是因为它要么是一个非常古老的编译器,要么是一台资源非常有限的机器。
归结为它依赖于机器;因此不同的操作系统将以自己的方式处理它。 (即 32 位与 64 位等)它不会影响可移植性,除非使用(非常)旧的编译器。如果有问题,您可以检查编译器版本的规格,通过搜索您的编译器及其版本可以轻松在网上找到。
正式的语言定义不想排除合理的实现,所以他们总是要小心一点。
例如,典型的调试版本仍然符合标准,但我很清楚 vector<bool>
未在调试模式下压缩。
现在这不是未指定,而是实现已定义。这意味着它是否被压缩的事实应该在某个地方的编译器文档中,但标准没有描述文档应该如何组织。
如果您的编译器不支持它,您可以使用另一个库(Boost 是显而易见的候选者)。 vector<bool>
通常不是 class,它依赖于深度编译器魔法,因此替代方案很容易编写。