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