在documentation中,我看到std::vector<bool>
通过使每个布尔值占据一个位来优化空间效率。从文档:std :: vector <bool>优化实施
std :: vector空间效率的方式(以及它是否被优化)是实现定义的。
这是否意味着它取决于编译器的实现? 如果有,我可以在哪里检查我的编译器是否支持它?为什么他们不希望它支持?这似乎是一个非常简单和高效的实现。
如果不是,那么这意味着什么,如果我想要进行优化,这意味着什么?
我正在使用TDM GCC工具集。
在documentation中,我看到std::vector<bool>
通过使每个布尔值占据一个位来优化空间效率。从文档:std :: vector <bool>优化实施
std :: vector空间效率的方式(以及它是否被优化)是实现定义的。
这是否意味着它取决于编译器的实现? 如果有,我可以在哪里检查我的编译器是否支持它?为什么他们不希望它支持?这似乎是一个非常简单和高效的实现。
如果不是,那么这意味着什么,如果我想要进行优化,这意味着什么?
我正在使用TDM GCC工具集。
正式的语言定义不想排除合理的实现,所以他们总是要小心。
例如,典型的调试版本仍然符合标准,但我可以很好地看到未在调试模式下压缩的vector<bool>
。
现在这不是未指定但实现定义。这意味着它是否被压缩应该放在编译器文档的某个地方,但标准没有描述如何组织文档。
如果你的编译器不支持它,你可以使用另一个库(Boost是明显的候选)。 vector<bool>
通常不是一个依赖于深层编译魔法的类,所以替代方法很容易编写。
它是依赖于实现的,而不是可移植的。它似乎有一些设计缺陷,你应该避免使用vector<bool>
。你可以从Meyers的“Effective STL,item 18”中获得更多细节。
如果您真的关心空间效率,您可以改用std::bitset
。
定义的实现表示它取决于什么构成抽象机器的参数。 (I.E.,定义你的主机操作系统的算法,它们的实现规范和系统调用)。关于什么是“实现定义”是指信息Q & A是here。
更可能的,如果你有一个现代机械与现代的编译器/ IDE,它支持实现定义。
如果编译器没有按”不支持它,这不太可能是因为它们不是“想要”它,而是因为它是一个非常老的编译器,或者是一个非常资源有限的机器
归结为它是依赖于机器的;所以不同的操作系统将处理它自己的方式(即,32位与64位等)。它不会影响可移植性,除非使用(非常多)较旧的compil呃。你可以检查编译器版本的规格,如果它是一个问题,通过搜索你的编译器和它的版本很容易找到它。
是的,这意味着执行'std :: vector'主要取决于编译器。它可能不会被优化,或者可能会以特定于实现的方式进行优化。一般来说,您可以通过查阅编译器的文档来了解这一点。有了GCC和其他开源工具链,我想你也可以查阅源代码。但是,这不仅需要更多的工作,它可能不是一个好主意,因为源代码只记录实现,而不是合同。 –
检查是否提供了这种优化的简单方法是检查'std :: vector :: reference_type'是否为'bool&'或别的东西。在后一种情况下,您有一个代理类型,应该只允许“优化”实现。 –
@MatteoItalia'std :: vector :: reference'需要成为代理,即使实现并未实际打包这些位。 –