如何判断内存分配是否可轻松调整大小,避免realloc不必要拷贝开销
关于查询内存块可原地扩容性的需求说明
realloc 可能仅需更新内存记账信息即可扩大分配的内存空间,也可能实际调用malloc申请新内存块,再memcpy原分配的内容(也可能调用失败)。
我希望能够向内存管理器查询某块内存分配是否可轻松调整大小(可能是因为初始化malloc时预留了额外空间,也可能是内存管理器可合并相邻空闲块等原因)。如果可以就直接申请扩容,否则我将自行调用malloc,按需按任意顺序拷贝原内存的任意子集内容。
目前StackOverflow上的其他相关回答基本分为四类:
- 无论如何都建议直接用
realloc:但处理大量数据时这种方案效率很低,双倍拷贝会带来严重的性能影响,不过通常它是最快的可移植方案。 - 建议手动执行
malloc+memcpy+free流程:这种方案性能更差,原来仅当无法原地扩容时才会出现的双倍拷贝,变成了每次内存占满扩容时都会全量拷贝,表现极差。 - 建议使用平台专属扩展:这种方案不具备实用性,我的代码和多数C代码一样需要跨平台运行。
- 直接表示该需求无法实现:但C语言本身就默认内存管理器具备原地扩容或者新建内存块的能力,为什么不能多开放一层控制权限?我们已经有对齐分配的aligned malloc,为什么不能有查询可扩容性的能力?
备注:该问题同时标注了C和C++标签,两种语言的解决方案都可接受且适用。
补充说明
引用FB vector的描述如下:
还有更值得注意的问题:很多内存分配器都不支持原地重分配,尽管其中绝大多数本身可以做到这点。这源于
realloc()广受诟病的设计:它会不透明地选择执行原地重分配,或者走「申请新内存-拷贝内容-释放旧内存」的流程。这种控制能力的缺失随后迫使所有基于C标准库的分配器设计都回避原地重分配,包括C++的new和std::allocator。这是巨大的效率损失,因为成本极低的原地重分配本可以支持更保守的内存增长策略,反过来就意味着更少的冗余内存占用和更快的重分配速度。
内容的提问来源于stack exchange,提问作者NeedHelp
相关产品推荐
相关产品推荐

