如何有效地调整使用一些符合标准的C++分配器分配的数组的大小?我知道不提供重新分配的设施在C++分配器接口中,但是C++11版本是否使我们能够更容易地使用它们呢?假设我有一个类vec,它定义了一个拷贝赋值操作符foo& operator=(const foo& x)。如果x.size() > this->size(),我不得不
foo ()。foo.的内部存储x.size()元素的新缓冲区。有什么方法可以更容易地重新分配foo的内部存储而不必经历所有这些?如果您认为这将是有用的,我可以提供一个实际的代码示例,但我觉得这里没有必要。
发布于 2012-01-12 08:34:11
基于前一个问题,我处理可以以合理效率增长和收缩的大型数组的方法是编写一个类似于将数组分解为多个小数组页的容器。例如,假设我们有一个n个元素数组,我们选择一个页面大小p,并创建p元素的1+ n/p数组(pages)。当我们想要重新分配和增长时,我们只需将现有的页面保留在原来的位置,然后分配新的页面。当我们想缩小的时候,我们释放了完全空白的页面。
缺点是数组访问速度稍慢,在给定的和索引i中,您需要页=i/ p和偏移量到页i% p中,才能获得元素。我发现这仍然是非常快,但提供了一个很好的解决方案。理论上,std::deque应该做一些类似的事情,但是对于我用大数组尝试的情况,它非常慢。有关更多细节,请参见关于链接问题的评论和说明。
在给定n个元素时,我们总是保留p%p元素,这也是内存的低效。也就是说,我们只分配或释放完整的页面。这是我在需要重新调整大小和快速访问的大型数组的上下文中能够找到的最好的解决方案,而我并不怀疑有更好的解决方案,我希望看到它们。
发布于 2012-01-12 03:02:02
如果
x.size() > this->size()在foo& operator=(foo&& x)中出现,也会出现类似的问题。
不,它不是。你只是swap。
发布于 2012-01-12 21:44:03
没有任何函数会在失败时调整大小或返回0 (以调整大小)。除了告诉您一个特定的分配实际上有多大之外,我不知道有哪个操作系统支持这种功能。
然而,所有操作系统都支持实现realloc,但是,如果不能适当调整大小,则可以执行副本。
因此,您不能使用它,因为如果您必须添加一个标准函数来实现,C++语言将无法在大多数当前操作系统上实现。
https://stackoverflow.com/questions/8829449
复制相似问题