首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的有效阵列再分配

C++中的有效阵列再分配
EN

Stack Overflow用户
提问于 2012-01-12 02:37:47
回答 6查看 1.9K关注 0票数 12

如何有效地调整使用一些符合标准的C++分配器分配的数组的大小?我知道不提供重新分配的设施在C++分配器接口中,但是C++11版本是否使我们能够更容易地使用它们呢?假设我有一个类vec,它定义了一个拷贝赋值操作符foo& operator=(const foo& x)。如果x.size() > this->size(),我不得不

  1. 在allocator.destroy内部存储的所有元素上调用foo ()。
  2. 调用allocator.deallocate()在foo.的内部存储
  3. 重新分配一个有足够空间容纳x.size()元素的新缓冲区。
  4. 使用std::uninitialized_copy填充存储。

有什么方法可以更容易地重新分配foo的内部存储而不必经历所有这些?如果您认为这将是有用的,我可以提供一个实际的代码示例,但我觉得这里没有必要。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-01-12 08:34:11

基于前一个问题,我处理可以以合理效率增长和收缩的大型数组的方法是编写一个类似于将数组分解为多个小数组页的容器。例如,假设我们有一个n个元素数组,我们选择一个页面大小p,并创建p元素的1+ n/p数组(pages)。当我们想要重新分配和增长时,我们只需将现有的页面保留在原来的位置,然后分配新的页面。当我们想缩小的时候,我们释放了完全空白的页面。

缺点是数组访问速度稍慢,在给定的和索引i中,您需要页=i/ p和偏移量到页i% p中,才能获得元素。我发现这仍然是非常快,但提供了一个很好的解决方案。理论上,std::deque应该做一些类似的事情,但是对于我用大数组尝试的情况,它非常慢。有关更多细节,请参见关于链接问题的评论和说明。

在给定n个元素时,我们总是保留p%p元素,这也是内存的低效。也就是说,我们只分配或释放完整的页面。这是我在需要重新调整大小和快速访问的大型数组的上下文中能够找到的最好的解决方案,而我并不怀疑有更好的解决方案,我希望看到它们。

票数 4
EN

Stack Overflow用户

发布于 2012-01-12 03:02:02

如果x.size() > this->size()foo& operator=(foo&& x)中出现,也会出现类似的问题。

不,它不是。你只是swap

票数 1
EN

Stack Overflow用户

发布于 2012-01-12 21:44:03

没有任何函数会在失败时调整大小或返回0 (以调整大小)。除了告诉您一个特定的分配实际上有多大之外,我不知道有哪个操作系统支持这种功能。

然而,所有操作系统都支持实现realloc,但是,如果不能适当调整大小,则可以执行副本。

因此,您不能使用它,因为如果您必须添加一个标准函数来实现,C++语言将无法在大多数当前操作系统上实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8829449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档