2016-07-11 55 views
7

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

std :: vector空间效率的方式(以及它是否被优化)是实现定义的。

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

如果不是,那么这意味着什么,如果我想要进行优化,这意味着什么?

我正在使用TDM GCC工具集。

+1

是的,这意味着执行'std :: vector '主要取决于编译器。它可能不会被优化,或者可能会以特定于实现的方式进行优化。一般来说,您可以通过查阅编译器的文档来了解这一点。有了GCC和其他开源工具链,我想你也可以查阅源代码。但是,这不仅需要更多的工作,它可能不是一个好主意,因为源代码只记录实现,而不是合同。 –

+1

检查是否提供了这种优化的简单方法是检查'std :: vector :: reference_type'是否为'bool&'或别的东西。在后一种情况下,您有一个代理类型,应该只允许“优化”实现。 –

+1

@MatteoItalia'std :: vector :: reference'需要成为代理,即使实现并未实际打包这些位。 –

回答

2

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

例如,典型的调试版本仍然符合标准,但我可以很好地看到未在调试模式下压缩的vector<bool>

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

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

0

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

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

+0

可悲的是我不能使用std :: bitset,因为我需要动态初始化。 – Simon

+3

FWIW,Boost有一个[dynamic_bitset](http://www.boost.org/doc/libs/1_61_0/libs/dynamic_bitset/dynamic_bitset.html),但有时候Boost可能是一个矫枉过正。如果你知道如何使用它,'std :: vector '并不是那么糟糕,毕竟,[有人指出](https://isocpp.org/blog/2012/11/on-vectorbool)。 – legends2k

3

定义的实现表示它取决于什么构成抽象机器的参数。 (I.E.,定义你的主机操作系统的算法,它们的实现规范和系统调用)。关于什么是“实现定义”是指信息Q & A是here

更可能的,如果你有一个现代机械与现代的编译器/ IDE,它支持实现定义。

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

归结为它是依赖于机器的;所以不同的操作系统将处理它自己的方式(即,32位与64位等)。它不会影响可移植性,除非使用(非常多)较旧的compil呃。你可以检查编译器版本的规格,如果它是一个问题,通过搜索你的编译器和它的版本很容易找到它。

相关问题