std::d eque 什么时候需要重新分配
When does std::deque need reallocation?
我所知,std::deque
将其元素存储在块块中(尽管它依赖于实现,但这是我在大多数源代码中读到的(,而不是在大多数情况下使用单个内存块的std::vector
。
因此,std::vector
在插入过程中遇到重新分配是相当合理的。但是,我无法将任何需要重新分配std::deque
的情况联系起来,因为当电流被炸毁时,它只是以新的内存块重新开始。
任何人都可以为我提供一个案例,即由于对其执行某些操作而导致std::deque
需要重新分配?
谁能为我提供 std::d eque 需要重新分配的情况,因为 对其执行某些操作的结果。
在典型情况下,永远不会。虽然未指定deque
的精确实现细节,但保留迭代器/指针/引用失效*和算法要求对于任何需要将现有内存块重新分配给更大或更小的内存块的场景来说,都会发现实际用途不佳。
[特别关注指针/引用失效,因为这告诉我们更多关于内存中必须发生的事情。迭代器可以做出一些例外,将其有效性与deque
]的内存表示分离。
试着设身处地为实施者着想。你如何实现像push_front
、push_back
和扩展resize
这样的功能,如果你曾经试图重新分配内存块,就不会使任何现有的指向deque
的指针失效?
现有内存块重新分配给更小的尺寸,请保留对pop_front
和pop_back
以及缩小resize
的类似要求(仅使指向已删除元素的指针无效(?
陷阱部分,以及您可能会发现重新分配的最遥远可能性的一个地方,是插入到deque
的中间。这是指向deque
的所有指针都可以失效的地方,并且可以重新分配deque's
内容(可能,不一定实用(。只有在这种特殊情况下,作为deque
实现者,我们才能使指向仍然存在的元素的指针失效,我们甚至可以自由地重新分配任何现有的内存块。但这不太可能发生,因为高效的insert
实现通常只想洗牌和移动元素,而不是实际重新分配它们所在的内存块。
所有这些要求结合在一起,将实现限制在 Sutter 描述的类型上,即使他在那里有点草率并掩盖了理论部分。这有点像 C++03 代码通常理所当然地认为std::vector
总是连续的,即使它是未指定的,因为std::vector
的算法和迭代器要求使得连续表示几乎是唯一实际的选择。
因此,从理论上讲,有人可能会以某种方式在符合这些要求的同时偷偷在某个地方进行重新分配。但在实践中,这几乎是不可能的,而且绝对是不切实际的,所以你很难找到这样deque
的实现。
我想到的一件事是,当您在 deque 上进行插入并且插入需要转到的页面已满时会发生什么? 插入函数上关于 deques 的 cplusplus.com 状态
If the insertion happens at the beginning or the end of the sequence, all iterators
related to this container are invalidated, but pointers and references remain valid,
referring to the same elements they were referring to before the call. If the
insertion happens anywhere else in the deque, all iterators, pointers and references
related to this container are invalidated.
真正引起我注意的部分是一切都无效,插入在中间,对我来说听起来底层数据结构正在发生一些事情。 我不确定这是否是重新分配,但它至少是移位复制插入。
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 为模板参数类型中的新对象分配内存
- 新运算符分配的大小大于声明的大小.为什么
- 在C++中分配分配
- 为什么支撑初始化分配分配填充垃圾变量
- C 新操作员分配新内存
- 新不分配内存?
- 如果我的C++“新”内存分配失败,如何找出返回值
- 我可以用新的分配内存块吗?
- COM / DCOM:服务器存根不会为现有接口中的新方法分配内存
- 在线程在 C++ 中完成后将新任务分配给线程
- 只能使用CUDA中的新运算符分配有限的内存
- 与将新内容分配给向量的指针斗争
- 确定C++中新运算符分配的内存大小
- 按新内存分配
- 是否有必要使用 'new' 将新指针分配给与指向同一结构的先前存在的指针相同的结构?如果是这样,为什么?
- 用于新运算符分配的公共内存
- boost::io_service post方法是否引起新的分配?
- 如何在C++中检索由新运算符分配的对象的地址