当我们用size() == capacity()
做push_back
时会发生什么?
但是,为什么我们必须这样做呢?我们有一个虚拟内存机制,我们可以叫它realloc(vec.data(), (sizeof(vec::value_type) * vec.size()) * 2)
。Allocator
将给我们一个新的内存页,并且虚拟地址使内存"一致",因此我们不必从向量中复制值。
我是否理解错了虚拟内存机制?
你正确理解了虚拟内存机制,基本上你可以创建任意数量的连续的页对齐数组在进程的虚拟内存空间中,它们将由不连续的物理内存支持。
但这与std::vector
无关,因为std::allocator
没有提供任何API来利用这一点,我认为有些人认为这是一个疏忽。
请注意,c++不仅限于支持虚拟内存的体系结构,尽管我认为如果它被实现的话,它将是标准库的一个实现细节。
不,你不能使用Crealloc
,因为c++有真正生命周期的对象,所有的东西都不只是一堆字节,可以随意复制,一些特殊的blobs可能不喜欢被移动,如果你强迫它们移动,它们也不会感激。
是的,如果你正在处理pod,这将与custom::vector
一起工作,而不是基于std::allocator
的std::vector
。
在作品中有一篇论文解决了你的问题,并超越了realloc
,认为"它的时代已经过去了"。- P0901,几天前收到了委员会相当积极的反馈。