你能阻止对 push_back() 进行 std::vector 边界检查吗?

Can you prevent std::vector bounds-checking on push_back()?

提问人:Zebrafish 提问时间:7/26/2017 更新时间:6/1/2019 访问量:737

问:

我知道在索引向量时,有一些方法可以做或不做边界检查,但特别是在 push_back() 上,即使我知道向量的容量足够大(即,我保留了足够大),并且我运行了一个循环将元素推回其中,我假设由于它是动态调整大小的,因此它总是必须在每个push_back上进行边界检查(或大小检查)。

如果是这种情况,那么我认为如果您知道自己不会超过容量,那么像 fast_push() 这样的东西会很有用。

我听说过一些向量库更快的说法,例如这个 http://andreoffringa.org/?q=uvector ,但是当知道不需要边界检查时,我没有特别看到 push_back() 的问题。链接中的那个声称速度提高了 50%。其中之一是在不需要时防止在构造时进行值初始化,以及其他一些事情。

谢谢。

C++ 数组向 std 边界

评论

9赞 Pete Becker 7/26/2017
检查向量中是否有足够的空间只是比较两个数字:当前上限和当前大小。这不是代码中的瓶颈。
1赞 geza 7/26/2017
你用什么对象实例化向量?也许你可以事先去向量,并使用resize[]
2赞 user4581301 7/26/2017
3D 矩阵,如 vector<vector<vector<point>>>?如果是这样,你的敌人可能会变成糟糕的空间局部性。A 是连续的,但对 s 的 s 没有这样的保证,因此将花费大量时间从跳转到并等待缓存加载。vectorvectorvectorvectorvector
4赞 Caleth 7/26/2017
要扩展@user4581301的观点:将 your 包装在 a 中,并在方法中进行计算std::vector<point>class Matrix(i * rows) + (k * cols) + j
2赞 ildjarn 6/1/2019
如果您可以重构代码以使用范围而不是提供随机访问迭代器,那么我希望进行单个边界检查,而不是每个元素进行一次检查,作为基本的 QoI 问题。insertpush_back

答: 暂无答案