std::realloc
如果 malloc 的内存包含非 pod 类型,则在 c++ 中是危险的。似乎唯一的问题是,std::realloc
如果它不能原地增加内存,就不会调用类型析构函数。
一个微不足道的工作将是一个try_realloc
函数。如果它不能就地增长,它不会分配新内存,而是简单地返回 false。在这种情况下,可以分配新内存,将对象复制(或移动)到新内存,最后释放旧内存。
这似乎非常有用。 std::vector
可以充分利用这一点,可能避免所有副本/重新分配。
抢先式阻燃剂:从技术上讲,这与 Big-O 性能相同,但如果向量增长是您应用程序中的瓶颈,那么即使 Big-O 保持不变,x2 的加速也是不错的。
但是,我找不到任何像try_realloc
.
我错过了什么吗?是try_realloc
不是没有我想象的那么好用?是否有一些隐藏的错误导致try_realloc
无法使用?
更好的是,是否有一些记录较少的 API 可以执行try_realloc
?
注意:我显然在这里使用库/平台特定代码。我并不担心,因为try_realloc
它本质上是一种优化。
更新:
根据 Steve Jessops 关于vector
使用 realloc 是否更有效的评论,我写了一个概念证明来测试。模拟realloc-vector
向量的增长模式,但可以选择重新分配。我在向量中运行了多达一百万个元素的程序。
作为比较vector
,在增长到一百万个元素时必须分配 19 次。
结果,如果realloc-vector
是唯一使用堆的东西,结果非常棒,3-4 分配,同时增长到百万字节的大小。
如果与以 66% 的速度增长的realloc-vector
a 一起使用,则 结果不太乐观,在增长期间分配 8-10 次。vector
realloc-vector
最后,如果与以相同速率增长的realloc-vector
a 一起使用,则分配 17-18 次。几乎没有比标准向量行为节省一个分配。vector
realloc-vector
我不怀疑黑客可以通过游戏分配大小来节省成本,但我同意史蒂夫的观点,即编写和维护这样一个分配器的巨大努力并没有带来收益。