是否有"尝试重新分配"同一地址上不同大小之类的事情?

Is there such a thing as 'try-reallocate' a different size on the same address?

本文关键字:地址 新分配 是否 分配      更新时间:2023-10-16

假设我用new分配了一大块字节,而它的大小已经不够了。我想添加另一堆字节到它,而不必重新分配和复制所有现有的数据。

我意识到没有办法保证这是可能的,因为我分配的块之后的内存可能被占用,但从理论上讲,应该可以"尝试",对吧?我认为这可以稍微优化我的动态大小的容器的性能。

如注释中所述,这在标准c++中是不可能的。

但是由于您的目标是减少重新分配和复制操作的数量,您可以通过提前分配内存来实现:

如果你的容器已经满了,你想添加另一个元素,不要仅仅增加一个元素,而是增加25%或50%。当向容器中添加单个元素时,这将减少重新分配和复制操作的数量,从O(n)减少到O(log(n))。当然,这种优势是以额外的内存分配为代价的。然而,你最初的建议也依赖于可用的空闲内存,所以没有真正的区别。

std::vector的常见实现似乎也使用了类似的策略。

功能std::realloc可能对您有所帮助。

可通过以下方式重新分配:

a)扩大或缩小ptr所指向的现有区域,如果可能的话。该区域的内容保持不变,直到新老尺寸较小。如果该区域被扩展,则数组新部分的内容是未定义的。

b)分配一个大小为new_size字节的新内存块,复制大小等于新旧大小的内存区域,并释放旧的内存块。

参见