在我们使用的C中malloc(), free(),但是在C++中你使用new, delete,但在C中我们也有realloc,它将分配新块并复制旧数据(常见的最小值),然后释放旧数据块.那么那个C++版本是什么?我当然可以写自己的,但是有内置的东西吗?
main() {
int i; char *x = malloc(3);
x[0] = 10;
x[1] = 20;
x[2] = 30;
realloc(x, 4);
x[3] = 40;
for (i = 0; i < 4; i++) printf("%i\n", x[i]);
}
Run Code Online (Sandbox Code Playgroud) std::realloc如果malloc内存包含非pod类型,则在c ++中是危险的.似乎唯一的问题是,std::realloc如果不能在原位增长记忆,就不会调用类型析构函数.
一个微不足道的工作将是一个try_realloc功能.如果它不能在原地生长,而不是malloc'ing新的记忆,它将简单地返回false.在这种情况下,可以分配新内存,将对象复制(或移动)到新内存,最后释放旧内存.
这看起来非常有用. std::vector可以充分利用这一点,可能避免所有副本/重新分配.
抢先阻燃:从技术上讲,这与Big-O性能相同,但如果矢量增长是您应用中的瓶颈,即使Big-O保持不变,x2加速也很好.
但是,我找不到任何有效的c api try_realloc.
我错过了什么吗?是try_realloc不是像我想象的那么有用吗?是否存在一些try_realloc无法使用的隐藏错误?
更好的是,是否有一些记录较少的API表现得如此try_realloc?
注意:我很明显,在这里的库/平台特定代码中.我并不担心try_realloc本来就是一种优化.
更新:
继Steve Jessops评论是否vector使用realloc更有效率后,我写了一个概念验证来测试.该realloc-vector模拟载体的增长模式,但有realloc的替代选项.我在程序中运行了一百万个元素.
为了比较,vector必须分配19次,同时增加到一百万个元素.
结果,如果realloc-vector是唯一使用堆的结果是令人敬畏的,3-4分配同时增长到百万字节的大小.
如果将realloc-vector其与vector66%的速度一起使用,realloc-vector 那么结果的速度就不那么大了,在增长期间分配8-10次.
最后,如果realloc-vector与以vector相同速率增长的a一起使用,则realloc-vector分配17-18次.在标准向量行为上仅保留一个分配.
我不怀疑黑客可以通过游戏分配大小来提高节省,但我同意Steve的观点,即编写和维护这样一个分配器所付出的巨大努力并不适用.
是的,另一种realloc与std::vector问题.我知道你要说什么,我同意,忘记手动内存分配,只需使用一个std::vector.不幸的是,我的教授禁止我使用STL的任何东西进行这项任务.
所以,是的,我有一个动态数组,T我需要它可以调整大小,我不能使用std::vector.我可以回到黑暗时代,malloc与家人一起完成整个事情,但如果我可以使用new那将是非常棒的.
我已经阅读了大量的std::vector帖子,其中每个人都说"不,你不能这样做,使用",但它们都是在2011年8月之前发布的,我希望自C +曙光以来可能有所改变的希望+11.那么告诉我,我是幸运的,还是我必须恢复到C风格的内存分配?