是否有"尝试重新分配"同一地址上不同大小之类的事情?
Is there such a thing as 'try-reallocate' a different size on the same address?
假设我用new分配了一大块字节,而它的大小已经不够了。我想添加另一堆字节到它,而不必重新分配和复制所有现有的数据。
我意识到没有办法保证这是可能的,因为我分配的块之后的内存可能被占用,但从理论上讲,应该可以"尝试",对吧?我认为这可以稍微优化我的动态大小的容器的性能。
如注释中所述,这在标准c++中是不可能的。
但是由于您的目标是减少重新分配和复制操作的数量,您可以通过提前分配内存来实现:
如果你的容器已经满了,你想添加另一个元素,不要仅仅增加一个元素,而是增加25%或50%。当向容器中添加单个元素时,这将减少重新分配和复制操作的数量,从O(n)减少到O(log(n))。当然,这种优势是以额外的内存分配为代价的。然而,你最初的建议也依赖于可用的空闲内存,所以没有真正的区别。
std::vector
的常见实现似乎也使用了类似的策略。
功能std::realloc
可能对您有所帮助。
可通过以下方式重新分配:
a)扩大或缩小ptr所指向的现有区域,如果可能的话。该区域的内容保持不变,直到新老尺寸较小。如果该区域被扩展,则数组新部分的内容是未定义的。
b)分配一个大小为new_size字节的新内存块,复制大小等于新旧大小的内存区域,并释放旧的内存块。
参见
相关文章:
- 新分配指向函数的指针是否合法?
- 在函数返回中返回对新分配的shared_ptr的尊重合法吗
- 如何删除新分配的字符,这也是函数返回值?
- C ++中新分配的int的内存大小,有没有不同更好的方法来查看它?
- 编译器忽略运算符新分配
- 方法向量的新/分配的复杂性::p ush_back
- 有没有一种方法可以全局填充新分配/删除分配
- 为什么我的新分配指针会自动在程序退出上删除
- 在避免新分配的同时,const变量的复杂初始化
- 明确分配或从内存中的特定地址/位置分配或访问值
- 新分配的堆内存的初始内容 (VS2010)
- 数据是否在放置新分配的内存中对齐
- 返回新分配的数组
- 数组的末尾指向新分配的数组C++
- C++,为什么在修改新分配的对象后会出现访问冲突
- 使用一个"新"分配四个对象数组
- 强制内存分配从 64 位 Linux 上的较高地址 (>4GB) 分配
- 我如何理解瓦尔格林德中的无效读取,其中地址大于分配的块大小
- 是否可以将一个新分配的块初始化为0
- 返回新分配的指针或通过参数更新对象