[英]std::vector insert() reallocation
我正在查看std :: vector代码,我发现了一些我不太了解的东西。 当capacity <size()+ 1时,它需要重新分配缓冲区,以便它可以插入新元素。 它的作用(据我能从代码中提取)是:
据我所知,前缀和后缀副本是用memmove完成的。 是不是memmove数据的纯二进制副本? 它不会调用元素的构造函数,是吗? 我想知道的是,为什么函数会调用旧缓冲区中元素的析构函数,如果内存刚被移动,而不是在新缓冲区中重新构造?
我查看了MSVC8 vector
实现 - 我看不到memmove()
。 先前的向量元素不会被移动,它们被复制并且它们的复制c'tor被调用以将它们复制到新缓冲区(缓冲区在单个分配中分配,元素使用placement new构建)。
当然这只是MSVC实现,但它是vector
应该按照标准行事的方式。
但是,使用memmove
有时可以 - 例如对于std::vector<int>
- 并且STL实现可以自由地专门针对这种情况。 您可能错过了阅读源代码的模板“分支”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.