当我们扩展 std::vector<> 时发生了什么?



当我们用size() == capacity()push_back时会发生什么?

关于这个问题,我听到了很多意见。最流行的是:当vector的大小达到其容量时,分配一个新的内存区域,将vector复制到新分配的内存中,并在vector的末端插入新值。

但是,为什么我们必须这样做呢?我们有一个虚拟内存机制,我们可以叫它realloc(vec.data(), (sizeof(vec::value_type) * vec.size()) * 2)Allocator将给我们一个新的内存页,并且虚拟地址使内存"一致",因此我们不必从向量中复制值。

我是否理解错了虚拟内存机制?

你正确理解了虚拟内存机制,基本上你可以创建任意数量的连续的页对齐数组在进程的虚拟内存空间中,它们将由不连续的物理内存支持。

但这与std::vector无关,因为std::allocator没有提供任何API来利用这一点,我认为有些人认为这是一个疏忽。

请注意,c++不仅限于支持虚拟内存的体系结构,尽管我认为如果它被实现的话,它将是标准库的一个实现细节。

不,你不能使用Crealloc,因为c++有真正生命周期的对象,所有的东西都不只是一堆字节,可以随意复制,一些特殊的blobs可能不喜欢被移动,如果你强迫它们移动,它们也不会感激。

是的,如果你正在处理pod,这将与custom::vector一起工作,而不是基于std::allocatorstd::vector

在作品中有一篇论文解决了你的问题,并超越了realloc,认为"它的时代已经过去了"。- P0901,几天前收到了委员会相当积极的反馈。

相关内容

  • 没有找到相关文章

最新更新