当我们展开 std::vector<> 时会发生什么?

Wel*_*ial 0 c++ memory memory-management stl vector

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

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

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

难道我对虚拟内存机制的理解有误?

Qui*_*mby 5

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

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

请注意,C++ 不仅限于支持虚拟内存的体系结构,尽管我认为如果无论如何实现它,它都将是标准库的实现细节。

不,你不能使用 C,realloc因为 C++ 拥有具有实际生命周期的对象,一切都不仅仅是可以随心所欲地自由复制的字节 blob,一些特殊的 blob 可能不喜欢被移动,如果你强迫它们移动,它们也不会欣赏它。

是的,如果您正在处理 POD,这将适用于custom::vector,而不是std::vector基于std::allocator

作品中有一篇论文解决了您的担忧并超越了这一点realloc,认为“它的日子已经过去了”——P0901 几天前收到了委员会相当积极的反馈。