如果分配器提供 realloc 语义,std::vector 可以避免复制吗?
Posted
技术标签:
【中文标题】如果分配器提供 realloc 语义,std::vector 可以避免复制吗?【英文标题】:Can std::vector avoid copying if allocator provides realloc semantics? 【发布时间】:2014-06-23 16:10:36 【问题描述】:我有一个内存接口,它将获取地址空间与附加后备存储区分开来。 (在 Linux 下,由接口管理的地址空间池是 mmap 的 MAP_ANONYMOUS 和 MAP_NORESERVE,madvise 的 MADV_DONTNEED 和 mprotect 的 PROT_NONE。然后由 madvise MADV_WILLNEED 和 mprotect PROT_READ、PROT_WRITE 和 PROT_EXEC 附加支持。)
这个接口允许我分配大量的地址空间,同时懒惰地获取实际的物理内存。我想用它来创建一个“惰性向量”,它会在适当的点请求后备存储,但从不复制向量的当前内容,因为它的增长。
考虑到标准库分配器的语义,这样的方案可能吗?感激地接受指针、提示或其他指导。
【问题讨论】:
Maybe related. 【参考方案1】:标准库分配器接口中没有提供调整现有内存块大小的规定。只有“分配一个大小为 N 的块”和“释放一个块”语义。
因此,您的问题的答案是“不,您不能使用 std::vector
执行此操作”
当然,您可以编写自己的类似矢量的类来执行此操作 - 如果这对您很重要,您应该这样做。编写容器类并不是真的那么难。
【讨论】:
我自己或多或少得出了这个结论,但希望我可能错过了什么。在查看了我必须禁用的向量成员函数以及剩下的那些简单之后,我得出结论,我确实需要编写自己的容器。感谢您的额外推动。以上是关于如果分配器提供 realloc 语义,std::vector 可以避免复制吗?的主要内容,如果未能解决你的问题,请参考以下文章
如果 Malloc 无法分配 X 字节,我是使用 Realloc 还是再次使用 Malloc? C++