【发布时间】:2022-06-30 05:19:17
【问题描述】:
与std::vector 相比,std::deque 的缺点是在访问随机位置的元素时性能较慢,而且存储数据的内存块具有预定义的固定大小。
是否有替代(甚至在 STL 之外)容器类允许:
- 在构造函数中为所有块设置块大小,或者
- 为每个块设置不同的块大小。
- 防止大多数索引访问必须执行两个指针取消引用;例如一旦我访问某个内存块中的元素,同一内存块中的以下访问应该具有类似
std::vector的性能。
注意:我感兴趣的是与访问元素相关的性能,而不是它们的插入/删除。
【问题讨论】:
-
“块大小”和“两个指针解引用”是实现细节。容器没有由它们的实现来指定;它们由它们的接口和这些接口的属性指定。你想用这个假设的容器做什么?
-
如果你能描述你想用你的数据做什么,而不是你认为它应该如何工作,那将会很有帮助。你有排序数据吗?您是否更频繁地阅读或写作,是否以可预测的方式访问它(缓存命中/分支预测)等。以及您想要解决的实际问题是什么。性能不是一招一式的小马
-
@TedLyngmo 我也在考虑这些问题。最后,如果性能符合预期/指定,OP 应该测量实际数据。衡量总是衡量......
-
如果你打算在迭代器中隐藏目标数据结构实现的复杂性(就像 STL 主要做的那样),那么你很难像
std::vector一样快。实际上,std::vector在内存中是连续的,并且具有简单的迭代器实现。因此,编译器可以执行许多高级优化(例如矢量化),从而在许多情况下带来巨大的性能提升。使用这种基于块的结构,您需要使用缓慢的条件(或导致等效的循环携带依赖的技巧),这往往会阻止编译器优化。 -
如果您想知道“不可预测”的性能(增益)如何可以观看:youtube.com/watch?v=FJJTYQYB1JQ (youtube.com/watch?v=FJJTYQYB1JQ)。
标签: c++ performance stdvector deque stddeque