繁体   English   中英

std :: vector insert()重新分配

[英]std::vector insert() reallocation

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM