我正在查看std :: vector代码,我发现了一些我不太了解的东西。当容量< size()+ 1需要重新分配缓冲区,以便插入新元素。它的作用(据我能从代码中提取)是:
就我所见,前缀和后缀副本是用memmove完成的。是不是memmove数据的纯二进制副本?它不会调用元素的构造函数,是吗?我想知道的是,为什么函数在旧缓冲区中的元素上调用析构函数,如果内存刚被移动,而不是在新缓冲区中重构?
答案 0 :(得分:5)
我查看了MSVC8 vector
实现 - 我看不到memmove()
。之前的向量元素不会被移动,它们被复制并且它们的复制c'tor被调用以将它们复制到新缓冲区(缓冲区在单个分配中分配,元素使用placement new构建)。
当然这只是MSVC实现,但它是vector
应该按照标准行事的方式。
但是,使用memmove
有时是正常的 - 例如std::vector<int>
- 并且STL实现可以自由地专门针对这种情况。您可能错过了阅读源代码的模板“分支”。