std :: vector insert()重新分配

时间:2010-01-24 14:13:56

标签: c++ stdvector

我正在查看std :: vector代码,我发现了一些我不太了解的东西。当容量< size()+ 1需要重新分配缓冲区,以便插入新元素。它的作用(据我能从代码中提取)是:

  • 分配新缓冲区
  • 复制旧缓冲区的前缀(0 - 插入索引)
  • 在新缓冲区中构造新元素
  • 复制旧缓冲区的后缀(index - end)
  • 在旧缓冲区中的所有项目上调用析构函数
  • 解除分配旧缓冲区

就我所见,前缀和后缀副本是用memmove完成的。是不是memmove数据的纯二进制副本?它不会调用元素的构造函数,是吗?我想知道的是,为什么函数在旧缓冲区中的元素上调用析构函数,如果内存刚被移动,而不是在新缓冲区中重构?

1 个答案:

答案 0 :(得分:5)

我查看了MSVC8 vector实现 - 我看不到memmove()。之前的向量元素不会被移动,它们被复制并且它们的复制c'tor被调用以将它们复制到新缓冲区(缓冲区在单个分配中分配,元素使用placement new构建)。

当然这只是MSVC实现,但它是vector应该按照标准行事的方式。

但是,使用memmove有时是正常的 - 例如std::vector<int> - 并且STL实现可以自由地专门针对这种情况。您可能错过了阅读源代码的模板“分支”。