6

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

  • 分配新的缓冲区
  • 复制旧缓冲区的前缀(0 - 插入索引)
  • 在新缓冲区中构造新元素
  • 复制旧缓冲区的后缀(索引 - 结束)
  • 对旧缓冲区中的所有项目调用析构函数
  • 释放旧缓冲区

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

4

1 回答 1

5

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

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

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

于 2010-01-24T14:21:29.667 回答