生产中的 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_each
、accumulate
、count_if
等)替换您的手写循环,这甚至可以消除最低成本。
【讨论】:
【参考方案2】:在提升中,您的问题的答案在这里: http://lists.boost.org/boost-users/2006/02/16960.php
简而言之,范围检查基于boost/assert.hpp
:可以通过定义BOOST_DISABLE_ASSERTS
或NDEBUG
来禁用它们(您可以将其中之一作为编译器选项传递)。
在标准向量中,at()
会进行边界检查,但[]
不会。在大多数常见的编译器实现中,可以启用边界检查,但这必须显式完成(通常通过传递特殊标志或启用调试模式)。所以你的[]
操作已经针对向量进行了优化。
【讨论】:
以上是关于生产中的 STL 向量和 Boost 多阵列 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
当元素具有类成员 Boost Concurrent Queue 时无法调整向量的大小