在文档中,我可以看到通过使每个布尔值占用一个位来优化std::vector<bool>的空间效率。从文件中:
定义了std::向量的空间效率(以及它是否被优化)的实现方式。
这是否意味着它取决于编译器的实现?如果是这样,我在哪里可以检查我的编译器是否支持它?他们为什么不想得到支持呢?这似乎是一个非常简单和高效的实现。
如果不是,这意味着什么?如果我想要进行优化,这意味着什么?
我正在使用TDM GCC工具集。
发布于 2016-07-11 07:40:29
形式语言定义不想排除合理的实现,所以它们总是要谨慎一点。
例如,一个典型的调试构建仍然符合标准,但我很可能看到一个vector<bool>没有在调试模式中被压缩。
现在,这不是未指定的,而是定义的实现。这意味着它是否被压缩应该在编译器文档中的某个地方,但是标准没有描述文档应该如何组织。
如果您的编译器不像您想要的那样支持它,您可以只使用另一个库(Boost是明显的候选库)。vector<bool>通常不是一个依赖于深度编译器魔力的类,因此可以很容易地编写替代方案。
发布于 2016-07-11 06:14:54
实现定义的意味着它取决于抽象机器的构成参数。(即定义主机操作系统的算法、它们的实现规范和系统调用)。关于“实现定义”意味着什么的信息问答是这里。
更有可能的是,如果您有一台具有现代编译器/IDE的现代机器,那么它支持实现定义。
如果编译器不支持它,那不太可能是因为他们“不想要”它,而是因为它要么是一个非常老的编译器,要么是一台资源非常有限的机器。
归根结底,它是依赖于机器的;因此不同的操作系统将以自己的方式处理它。(即32位对64位等)它不会影响可移植性,除非使用(非常多的)旧编译器。如果需要检查编译器版本的规范,则可以检查它,通过搜索编译器及其版本,可以轻松地在网上找到它。
发布于 2016-07-11 05:28:34
它是依赖于实现的,不是可移植的。它似乎有一些设计缺陷,您应该避免使用vector<bool>。你可以从迈尔斯的“有效STL,第18项”获得更多细节。
如果你真的关心空间效率,你可以用std::bitset代替。
https://stackoverflow.com/questions/38299399
复制相似问题