如果分配器提供 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 可以避免复制吗?的主要内容,如果未能解决你的问题,请参考以下文章

realloc函数详解

如果没有顺序的内存空间,realloc 会做啥?

如果 Malloc 无法分配 X 字节,我是使用 Realloc 还是再次使用 Malloc? C++

C:malloc/calloc/realloc/alloca内存分配函数

在 C++ 中使用 realloc

释放分配的内存:realloc() 与 free()