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