Does std::vector *have* to move objects when growing capacity? Or, can allocators quot;reallocatequot;?(增加容量时 std::vector *必须* 移动对象吗?或者,分配器可以“重新分配吗?)
问题描述
A 不同的问题激发了以下想法:
std::vector 是否必须在增加容量时移动所有元素?
据我所知,标准行为是底层分配器请求整个新大小的块,然后移动所有旧元素,然后销毁旧元素,然后释放旧内存.
鉴于标准分配器接口,这种行为似乎是唯一可能的正确解决方案.但我想知道,修改分配器以提供一个 reallocate(std::size_t) 函数是否有意义,该函数将返回一个 pair 并且可以映射到底层realloc()?这样做的好处是,如果操作系统实际上可以扩展分配的内存,则根本不需要移动.布尔值将指示内存是否已移动.
(std::realloc() 可能不是最好的选择,因为如果我们不能扩展,我们不需要复制数据.所以实际上我们更想要像 extend_or_malloc_new().也许基于 is_pod-trait 的特化将允许我们使用实际的 realloc,包括它的按位复制.只是不一般.)
这似乎是一个错失的机会.最坏的情况,你总是可以将 reallocate(size_t n) 实现为 return make_pair(allocate(n), true);,所以不会有任何惩罚.>
是否有任何问题使此功能不适用于 C++ 或不受欢迎?
也许唯一可以利用这一点的容器是 std::vector,但话说回来,这是一个相当有用的容器.
更新:一个小例子来澄清.当前resize():
pointer p = alloc.allocate(new_size);for (size_t i = 0; i != old_size; ++i){alloc.construct(p + i, T(std::move(buf[i])))alloc.destroy(buf[i]);}for (size_t i = old_size; i < new_size; ++i){alloc.construct(p + i, T());}alloc.deallocate(buf);buf = p;新实现:
pairpp = alloc.reallocate(buf, new_size);if (pp.second) {/* 和以前一样 *
本文标题为:增加容量时 std::vector *必须* 移动对象吗?或者,分配器可以“重新分配"吗?
基础教程推荐
- C++:获取传递给函数的多维数组的行大小 2021-01-01
- 如何在 C++ 中正确使用命名空间? 2022-01-01
- 随机插入/删除的综合向量与链表基准 2022-01-01
- 提升 ASIO 流缓冲 2021-01-01
- 将不可复制的闭包对象传递给 std::function 参数 2021-01-01
- 如何部分禁用 cmake C/C++ 自定义编译器检查 2021-01-01
- 如何更改 SysDateTimePick32 或 CDateTimeCtrl 的背景颜色? 2022-01-01
- 为什么我们不能使用“虚拟继承"?在 COM 中? 2022-01-01
- 与 CAS 的原子交换(使用 gcc 同步内置函数) 2022-01-01
- c++ STL设置差异 2022-01-01
