相关疑难解决方法(0)

std :: vector*在增加容量时是否有*移动对象?或者,分配器可以"重新分配"吗?

一个不同的问题启发了以下思想:

在增加容量时是否std::vector<T> 必须移动所有元素?

据我所知,标准行为是底层分配器请求新大小的整个块,然后移动所有旧元素,然后销毁旧元素,然后解除分配旧内存.

在给定标准分配器接口的情况下,此行为似乎是唯一可能的正确解决方案.但我想知道,修改分配器以提供一个reallocate(std::size_t)可以返回a pair<pointer, bool>并可以映射到底层的函数是否有意义realloc()?这样做的好处是,如果操作系统实际上只能扩展分配的内存,那么根本不需要进行任何移动.布尔值表示内存是否已移动.

(std::realloc()也许不是最好的选择,因为如果我们不能扩展,我们不需要复制数据.所以实际上我们更想要类似的东西extend_or_malloc_new().编辑:也许is_pod基于特征的专业化将允许我们使用实际的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); …
Run Code Online (Sandbox Code Playgroud)

c++ vector realloc allocator

51
推荐指数
2
解决办法
3107
查看次数

为什么通常的做法是在满载时加倍阵列容量?

我注意到实现动态数组非常常见(特别是在面试问题和家庭作业中); 通常,我看到的问题是:

实现一个阵列,当满了时容量翻倍

或者非常相似的东西.他们几乎总是(根据我的经验)明确地使用词,而不是更一般

实现一个阵列,在满员时增加容量

我的问题是,为什么加倍?我理解为什么使用常量值是个坏主意(感谢这个问题),但似乎使用更大的倍数而不是双倍更​​有意义; 为什么不将容量增加三倍,或者将容量增加四倍,或者将其平方?

要清楚,我不是要问如何将数组的容量加倍,我问为什么加倍是常规.

arrays

5
推荐指数
1
解决办法
893
查看次数

标签 统计

allocator ×1

arrays ×1

c++ ×1

realloc ×1

vector ×1