有没有像尝试重新分配'同一地址的大小不同?

时间:2016-06-29 06:09:14

标签: c++

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

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

2 个答案:

答案 0 :(得分:2)

如评论中所述,标准C ++无法实现。

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

如果您的容器已满并且您想要添加其他元素,请不要将容量增加1,而是将其增加25%或50%。在将单个元素添加到容器时,这将减少从O(n)到O(log(n))的重新分配和复制操作的数量。当然,这种优势是以分配额外内存为代价的。但是你的原始建议还依赖于可用的可用内存,所以没有什么区别。

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

答案 1 :(得分:0)

函数std::realloc可以帮助您。

  

重新分配由以下任一方式完成:

     

a)如果可能的话,扩大或缩小ptr指出的现有区域。该区域的内容保持不变,直至新旧尺寸中的较小者。如果该区域已展开,则数组新部分的内容未定义。

     

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

另见cppreference