已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题吗?**通过editing this post添加详细信息并阐明问题。
3天前关闭。
Improve this question
当我们用size() == capacity()
做push_back
时会发生什么?
关于这个问题,我听过很多意见,最流行的是:当向量的大小达到其容量时,它分配新的内存区域,将向量复制到新分配的内存,并在向量的末尾插入新值。
但是,为什么我们必须这样做呢?我们有一个虚拟内存机制,我们可以只调用realloc(vec.data(), (sizeof(vec::value_type) * vec.size()) * 2)
。Allocator
将给予我们一个新的内存页,虚拟地址使内存“一致”,所以我们不必从向量复制值。
我对虚拟内存机制的理解是否有误?
1条答案
按热度按时间unguejic1#
您正确理解了虚拟内存机制,基本上您可以在进程的虚拟内存空间中创建任意数量的连续页对齐数组,它们将由非连续物理内存支持。
但这与
std::vector
无关,因为std::allocator
没有提供任何API来利用这一点,我认为有些人认为这是一个疏忽。请注意,C不仅限于支持虚拟内存的体系结构,尽管我认为如果它被实现的话,它将是标准库的实现细节。
不,你不能使用C
realloc
,因为C有真实的的生存期的对象,一切都不只是一个字节的blob,可以随意复制,一些特殊的blob可能不喜欢被移动,如果你强迫他们移动,他们不会喜欢。是的,如果您正在处理POD,则这将适用于
custom::vector
,而不是基于std::allocator
的std::vector
。Works上有一篇文章解决了你的问题,超越了
realloc
,认为“它的时代已经过去了”-P0901,几天前收到了委员会相当积极的反馈。