生产中的 STL 向量和 Boost 多阵列 [重复]

Posted

技术标签:

【中文标题】生产中的 STL 向量和 Boost 多阵列 [重复]【英文标题】:STL Vectors and Boost Multi Arrays in production [duplicate] 【发布时间】:2014-05-22 05:07:38 【问题描述】:

我有一个广泛使用 STL 向量和 Boost 多数组的应用程序。该应用程序对性能非常敏感,因为它实时分析大量数据。

由于向量和多数组会进行越界检查,因此我预计会招致一些性能损失。我想知道是否有办法只在开发期间允许错误检查,但在生产中禁用它。

那么,我想知道这是否真的可行,以及它是否会对我的容器的性能产生影响?

【问题讨论】:

这取决于容器和访问类型,但我不会说“STL 和 boost 容器进行越界检查”。他们通常不会。 有趣。我主要使用 STL 向量和 Boost 多数组。当我顽皮时,他们对我尖叫。感谢您指出,我进行了编辑。 您使用的是哪个编译器/STL?通常有这样做的标志。 @nwp VC++ 来自 Visual Studio 2013 这在 SO 上重复了无数次,你试过搜索吗? 【参考方案1】:

实际上,我研究过的所有 STL 实现(VC、GCC 等)都完全符合您的要求。他们可能在调试/开发版本中检查了一些界限,但是当您为发布而构建时,它们会全部忽略。 Boost 容器也是如此(AFAIK)(例如see here,如另一个答案中所述。)

在某些情况下,不同的访问方法在边界检查方面具有不同的行为。例如,std::vector 成员函数 at() 总是会执行边界检查,但索引运算符 ([]) 在发布/非调试版本中不会这样做。

最后,如果这对您很重要,您应该只查看您正在使用的实现并确定。这只是几个容器上的少数几个函数。

关于边界检查的性能成本。在实践中,所有提供的 STL 算法都将使用 unchecked 访问容器(它们会预先进行错误检查,从那时起就不会打扰了。)因此,如果您使用 STL 算法,您就赢了'看不到任何任何性能开销。

在您自己的代码中,在您紧密的内部循环中,您可能会看到绑定检查对性能的负面影响。我没有做过任何基准测试,但我想在大多数情况下它会是最小的并且可以忽略不计。此外,在绝大多数用例中,您可以用 STL 算法(for_eachaccumulatecount_if 等)替换您的手写循环,这甚至可以消除最低成本。

【讨论】:

【参考方案2】:

在提升中,您的问题的答案在这里: http://lists.boost.org/boost-users/2006/02/16960.php

简而言之,范围检查基于boost/assert.hpp:可以通过定义BOOST_DISABLE_ASSERTSNDEBUG 来禁用它们(您可以将其中之一作为编译器选项传递)。

在标准向量中,at() 会进行边界检查,但[] 不会。在大多数常见的编译器实现中,可以启用边界检查,但这必须显式完成(通常通过传递特殊标志或启用调试模式)。所以你的[] 操作已经针对向量进行了优化。

【讨论】:

以上是关于生产中的 STL 向量和 Boost 多阵列 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在一个项目中混合 boost 和 stl 库的缺点?

将几何多边形内部表示提升为 STL 列表?

当元素具有类成员 Boost Concurrent Queue 时无法调整向量的大小

STL推力多向量变换?

STL 中 boost::upgrade_to_unique_lock 的等价物是啥?

在Qt工程中加Boost