在c中使用realloc

std :: realloc在c中是危险的,如果malloc’d内存包含非pod类型.似乎唯一的问题是std :: realloc不会调用类型析构函数,如果它不能原位增长内存.

一个微不足道的工作将是一个try_realloc函数.如果不能在原地生长,而不是malloc’ing新的记忆,它只会返回错误.在这种情况下,可以分配新的内存,将对象复制(或移动)到新的内存,最后旧的内存释放.

这似乎非常有用. std :: vector可以很好地利用这一点,可能避免所有的副本/重新分配.
抢先式阻燃剂:技术上,这与Big-O性能相同,但是如果您的应用程序中的向量增长是瓶颈,那么即使Big-O保持不变,x2加速也是很好的.

但是,我找不到任何类似于try_realloc的c api.

我错过了什么吗? try_realloc没有我想像的那么有用吗?是否有一些隐藏的bug,使try_realloc不可用?

更好的是,有没有一些执行类似于try_realloc的文档较少的API?

注意:我很明显,在这里的图书馆/平台的具体代码.我不担心,因为try_realloc本质上是一个优化.

更新:
遵循史蒂夫·杰罗普(Steve Jessops)评论说,使用realloc是否能够更有效地使用vector我写了一个概念验证来测试. realloc-vector模拟向量的增长模式,但可以选择realloc.我将该程序运行到矢量中的一百万个元素.

为了比较,矢量必须分配19次,同时成长为一百万个元素.

结果,如果realloc-vector是唯一使用堆的结果,结果是令人敬畏的,3-4分配同时增长到百万字节的大小.

如果realloc矢量与矢量一起使用,该矢量以66%的速度增长,则realloc矢量的结果不太有前途,在生长过程中分配8-10次.

最后,如果realloc矢量与以相同速率增长的向量一起使用,则realloc矢量分配17-18次.在标准向量行为中轻微保存一个分配.

我不怀疑一个黑客可以通过游戏分配大小来提高储蓄,但是我同意史蒂夫呢,编写和维护这样一个分配器的巨大努力并不奏效.

矢量通常以增量增长.你不能重复地做这些,除非你仔细安排的事情,以便在向量的内部缓冲区之上有一个很大的空闲地址(这实际上需要分配整个页面,因为显然你不能有其他的分配稍后在同一页).

所以我认为,为了在这里得到一个很好的优化,你需要的不仅仅是一个“微不足道的解决方案”,如果可能的话,你可以做一个便宜的重新分配 – 你必须以某种方式做一些准备工作,使它成为可能,并且准备费用你处理空间.如果你只是为某些向量来做,那就表示他们会变大,那么它是没有意义的,因为他们可以用reserve()来表示他们会变大.如果你有一个广泛的地址空间,你只能自动为所有的向量自动执行,这样你就可以在每个向量上“浪费”一大块.

据我所知,分配者概念没有重新分配功能的原因是保持简单.如果std :: allocator有一个try_realloc函数,那么每个分配器都必须有一个(在大多数情况下不能实现,并且总是必须返回false),否则每个标准容器都必须是专门的对于std :: allocator来利用它.两个选项都不是一个很好的分配器接口,尽管我认为几乎所有的Allocator类的实现者都不会是一个巨大的努力,只是添加一个do-nothing的try_realloc函数.

如果矢量由于重新分配而较慢,则deque可能是一个很好的替代品.

http://stackoverflow.com/questions/4089200/using-realloc-in-c

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在c中使用realloc