如果分配器提供realloc语义,std::vector能否避免复制?

9
我有一个内存接口,它将获取地址空间与附加后备存储区分开。(在Linux下,接口管理的地址空间池是mmap'ed MAP_ANONYMOUS和MAP_NORESERVE、madvise'ed MADV_DONTNEED和mprotect'ed PROT_NONE。然后通过madvise MADV_WILLNEED和mprotect PROT_READ、PROT_WRITE和PROT_EXEC附加支持。)
这个接口允许我分配大量地址空间,同时懒惰地获取实际的物理内存。我想使用这个接口创建一个"懒向量",在适当的时候请求支持,但永远不会复制向量的当前内容。
鉴于标准库分配器的语义,这种方案是否可行?指针、提示或其他指导将不胜感激。

3
也许有关联:当std::vector增加容量时,它是否必须移动对象,或者可以使用分配器避免移动? - Kerrek SB
1个回答

0

标准库分配器接口中没有为调整现有内存块大小提供任何规定。只有“分配大小为N的内存块”和“释放内存块”的语义。

因此,你的问题的答案是“不,你不能使用std::vector来做到这一点”

当然,你可以编写自己的类似于向量的类来实现这一点 - 如果这对你很重要,你应该这样做。编写容器类并不是真正那么难。


我自己也差不多得出了这个结论,但还是希望可能会有所遗漏。在看了我需要禁用多少向量成员函数以及剩下的那些函数的简单性之后,我得出了结论,确实需要编写自己的容器。感谢你额外的推动。 - John Yates

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接